2011-11-21 15 views
7

Mam problemy przechodzącą tablicę kodowanym do funkcji w CMijając tablicę kodowanym w C

stworzyłem strukturę, jak to w głównej:

int main() 
{ 
    struct Items 
    { 
     char code[10]; 
     char description[30]; 
     int stock; 
    }; 

    struct Items MyItems[10]; 
} 

Potem dostęp to lubią: MyItems[0].stock = 10; itp

Chcę przekazać go do funkcji tak:

ReadFile(MyItems); 

Funkcja powinna przeczytać tablicę i móc ją edytować. Wtedy powinienem mieć dostęp do tej samej tablicy z innych funkcji.

Próbowałem mnóstwo deklaracji, ale żaden z nich nie działa. np.

void ReadFile(struct Items[10]) 

miałem rozejrzeć dla innych pytań, ale jest to oni wszystko zrobić inaczej, z typedefs i gwiazdkami. Mój nauczyciel jeszcze nas nie nauczył, więc chciałbym zrobić to, co wiem.

Wszelkie pomysły? : S

EDIT: Odpowiedź Salvatore jest działać po Poprawiłem mój prototyp:

void ReadFile(struct Items[10]); 
+0

Jest to „prawdziwy kod”. Używam go w Visual Studio 2010 i działa. : S – lelouch

+1

"Visual Studio" i "to działa" nie będą używane w jednym zdaniu w grzecznej rozmowie. Musisz powiedzieć wprost, jeśli mówisz o konkretnych niestandardowych platformach; w przeciwnym razie ludzie przyjmą, że mówisz o ** standardzie **. –

+1

OK Naprawiłem to. Mam nadzieję, że to wystarczające. < – lelouch

Odpowiedz

7
struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[10]) 
{ 
    ... 
} 

void xxx() 
{ 
    struct Items MyItems[10]; 
    ReadFile(MyItems); 
} 

To w moim kompilator działa dobrze. Jakiego kompilatora używasz? Jaki błąd masz?

Pamiętaj, aby zadeklarować swoją strukturę przed swoimi funkcjami lub nigdy nie zadziała.

+0

Dzięki, to zadziałało, po tym jak poprawiłem mój prototyp, aby unieważnić ReadFile (struct Items [10]); – lelouch

0

Dlaczego nie używasz przekazać wskaźnik do tablicy z metodami, które go potrzebują?

Jeśli chcesz mieć tę samą tablicę struct, powinieneś użyć wskaźnika do tablicy i nie przekazać jej jako tablicy, ponieważ utworzy kopię.

void ReadFile (struct Items * items);

i gdzie można nazwać

struct Items myItems[10]; 
ReadFile(myItems); 

trzeba być ostrożnym ze wskaźnikami ...

+0

Czy możesz mi pokazać kod, żeby zrobić to ostatnie? – lelouch

+0

myItems da wskaźnik do 0 elementu tablicy. –

+0

Nie ma tu żadnej kopii, tablice nigdy nie są kopiowane. –

0

to dość dużo trzeba użyć wskaźników dla tego produktu. Ci funkcjonować będzie wyglądać następująco:

void ReadFile(Items * myItems, int numberOfItems) { 
} 
0

Trzeba użyć wskaźnika do tablicy, po czym jego łatwy dostęp do swoich członków

void readfile (pozycje * pozycji);

powinien działać.

0

Po przejściu przez strukturę podobną do tej, która w rzeczywistości tworzy lokalną kopię tej funkcji. Nie będzie to miało wpływu na oryginalną strukturę, niezależnie od tego, jak ją modyfikujesz w ReadFile.

Nie mam pewności co do innego podejścia, a to może nie odpowiedzieć na twoje pytanie, ale zalecam wypróbowanie wskazówek. Z pewnością będziesz ich dużo używać w C/C++.I mogą być naprawdę potężny raz je opanować

+0

To nieprawda, możesz to wypróbować, C przekazuje tablicę zawsze za pomocą wskaźnika, możesz modyfikować ją w ReadFile, tutaj nie ma tu miejsca kopiowanie. –

+0

@SalvatorePreviti Masz absolutną rację! Z jakiegoś dziwnego powodu zrozumiałem, że chciał użyć struktury w swojej metodzie, a nie w tablicy. -_- – Kaisar

1

Funkcja nie będzie wiedział, że typ struct Items istnieje, jeśli zadeklarujesz go tylko lokalnie w zasięgu jednostki funkcji . Należy więc określić zewnętrzną struct:

struct Item { /* ... */ }; 

void ReadFile(struct Items[]); /* or "struct Item *", same difference */ 

int main(void) 
{ 
    struct Item my_items[10]; 
    ReadFile(my_items); 
} 

Jest to niebezpieczne, ponieważ ReadFile oczywiście nie ma pojęcia, jak duża tablica jest (tablice są zawsze przeszedł przez rozpad do wskaźnika). Więc będzie typowo dodać tę informację:

void ReadFile(struct Items * arr, size_t len); 

ReadFile(my_items, 10); 
+0

Twój kod naprawił podkreślone błędy, ale nadal nie buduje - otrzymuję to: http: // pastebin.com/HxPTcPmL – lelouch

+0

A) błędy nie mają nic wspólnego z tą częścią kodu, B) teraz znowu jesteśmy zdezorientowani językiem - nagle jest to C++ ?? –

+0

lol, przykro mi, że mam zły kod, spróbuj ponownie. To od wypróbowania kodu – lelouch

0

zamiast swojego oświadczenia, oświadczam w ten sposób:

typedef struct { 
     char code[10]; 
     char description[30]; 
     int stock; 
}Items; 

i funkcję tak:

void ReadFile(Items *items); 

Z typedef zdefiniować nowy typ, dzięki czemu nie trzeba używać słowo "struct" za każdym razem.

3

Definicja struct Items poza głównym. Przekazując tablicę do funkcji w C, powinieneś także przekazać długość tablicy, ponieważ nie ma możliwości, aby funkcja wiedziała, ile elementów znajduje się w tej tablicy (chyba że gwarantowana jest stała wartość).

Jak wspomniano o Salvatore, musisz również zadeklarować (niekoniecznie zdefiniować) jakiekolwiek struktury, funkcje itp., Zanim będziesz mógł z nich korzystać. Zwykle masz swoje prototypy struktur i funkcji w pliku nagłówkowym w większym projekcie.

Poniżej jest modyfikacją pracy Twojego przykład:

#include <stdio.h> 

struct Items 
{ 
    char code[10]; 
    char description[30]; 
    int stock; 
}; 

void ReadFile(struct Items items[], size_t len) 
{ 
    /* Do the reading... eg. */ 
    items[0].stock = 10; 
} 

int main(void) 
{ 
    struct Items MyItems[10]; 

    ReadFile(MyItems, sizeof(MyItems)/sizeof(*MyItems)); 

    return 0; 
} 
Powiązane problemy