Jak skopiowac wartości z tablicy, wskaźniki

0
#include <stdio.h>
#include <stdint.h>

void gettab(uint8_t * tab, uint8_t size);
void gettab2(uint8_t ** tab, uint8_t *size);

uint8_t dest[5] = {0, 0, 0 ,0, 0};

uint8_t source[5] = {1, 2, 3, 4, 5};

int main()
{
    gettab(dest, 5);
    
    for(int i = 0; i<5; i++)
    {
        printf("%d ", dest[i]);
    }
    
    return 0;
}

void gettab(uint8_t * tab, uint8_t size)
{
    gettab2(&tab, &size);
    for(int i = 0; i<5; i++)
    {
        printf("%d  ", tab[i]);
    }
    printf("\n");
}

void gettab2(uint8_t ** tab, uint8_t *size)
{
    *tab = &source[0];
    *size = 5;
}

HEj, pytanie na szybko. Jak skopiować wartości z source do dest za pomoca funckji o takich nagówkach jak gettab i gettba2?

1

Użyj memcpy, operowanie na zmiennych globalnych to zła praktyka.

0

Ale tu nie chodzi o memcpy. Source to tablica staticowa w innym module. Ja mam ją pobrać za pomoca wywołania dwóch funckji gettab i gettab2.

1

No to wewnątrz nich użyj memcpy, w czym problem?

Wyczuwam, że albo masz problem XY, albo jesteś na jakimś egzaminie i nie podałeś całego kontekstu.

0

Egzamin końcem września?
Napiszę jeszcze raz dla jasności.
Jest moduł A który ma w sobie tablicę source typu static. ten moduł udostępnia funckję gettab2.
Drugi moduł B includuje moduł A i udostępnia funckję gettab. Nagłówki funckji sa z góry narzucone i takie mają pozostać. Żadne memcpy nie wchodzi w grę. Ja mam w aplikacji wywołać funckję gettab, która to wywoła gettab2. W tablicy dest powinny zostac zapisane wartości z tablicy source.

0

Moduł NIE MOŻE includować modułu. W programowaniu modułowym nie ma w ogóle takiego konceptu.
Jak zaczniesz używać poprawnego słownictwa, to i zagadnienie zobaczysz jaśniej

0

Programowałeś kiedyś struktualnie w C?
W języku strukturalnym Moduł to po prostu para plików name.h i name.c

0
void gettab(uint8_t * tab, uint8_t size);

to jest proste i zrozumiałe, skopuj mi tablicę o określonym rozmiarze. Ja podaję bufor a ta funkcja kopiuje co może.

void gettab2(uint8_t ** tab, uint8_t *size);

To jest dziwna konstrukcja, ale chodzi w niej: podaj mi swój bufor i jaki jest obecnie jego rozmiar.
Zero kopiowania bufora, tylko przekazanie informacji o buforze.

A ten, kto nadał nazwy tym funkcjom, najwyraźniej prosi o umieszczenie obuwia w tylnym ciemnym miejscu.

0

@MarekR22
Takie rozwiązanie miałeś na myśli?

#include <stdio.h>
#include <stdint.h>
 
void gettab(uint8_t * tab, uint8_t size);
void gettab2(uint8_t ** tab, uint8_t *size);
 
uint8_t dest[5] = {0, 0, 0 ,0, 0};
 
uint8_t source[5] = {1, 2, 3, 99, 5};
 
int main()
{
    gettab(dest, 5);
 
    for(int i = 0; i<5; i++)
    {
        printf("%d ", dest[i]);
    }
 
    return 0;
}
 
void gettab(uint8_t * tab, uint8_t size)
{
    uint8_t *ptr;
    uint8_t tmp_size;
    gettab2(&ptr, &tmp_size);
    
    for(int i = 0; i<tmp_size; i++)
    {
        *tab++ = *ptr++;
    }
    printf("\n");
}
 
void gettab2(uint8_t ** tab, uint8_t *size)
{
    *tab = (uint8_t*) &source[0];
    *size = 5;
}

Nazwy funkcji są trochę inne. Zmieniłem je na szybko.

0

No i jest źle gettab nie może zakładać, że size == tmp_size.
przykładowo dla size < tmp_size masz Undefined behavior.

0

No tak. To sobie poprawię. Na początku myślałem ze jest możliwość dostania się do tablicy source bez żadnego kopiowania.

1 użytkowników online, w tym zalogowanych: 0, gości: 1