2017-02-18 30 views
-1

Поскольку я не могу удалить: этот код работает, но я перепутал с циклами в моем коде!C: Передача массива вложенной структуры в функцию

Каким будет способом передать такую ​​структуру, чтобы char array был бы изменен ссылкой (действительное значение)?

Структуры выглядеть следующим образом:

#define CMAX 20 
typedef struct product_struct 
{ 
    char name[CMAX]; 
    int code; 
}product_struct; 

typedef struct shop_struct 
{ 
    prodcut_struct product[CMAX]; 
    int productCount; 
}shop_struct; 

Обычная функция DECLARE не делает трюк:

void funct(shop_struct *shop); 

Atleast это не работает, когда я пытаюсь скопировать что-то там, как это :

strcpy((shop + i)->product[j].name, someString); 

Таким образом, я могу получить доступ к имени в функция, но вне значения исчезает. Как мне это исправить?

Пример кода:

struct_shop shop[10]; 
void funct(shop_struct *shop) 
{ 
    (shop + 0)->product[0].code = 200; //This works! 
    strcpy((shop + i)->product[j].name, someString); //This works'ish 
} 
printf("%d", shop[0].product[0].code); //This works! 
printf("%s", shop[0].product[0].name); //This does not work! 
+1

Предоставьте [mcve]. В коде, который вы опубликовали, нет ничего явно неправильного. – StoryTeller

+0

Это означает, что 'shop', вероятно, * не * ссылается на правильно выделенную' struct'. – dasblinkenlight

+0

@StoryTeller, я написал свою проблему в сообщении. Этот код не работает должным образом. Да, он компилируется, но он не делает то, что должен. – Karl

ответ

1

Он должен работать. Вот рабочий пример:

#define CMAX 20 
typedef struct product_struct 
{ 
    char name[CMAX]; 
    int code; 
} product_struct; 

typedef struct shop_struct 
{ 
    product_struct product[CMAX]; 
    int productCount; 
} shop_struct; 


void rename_at(int n, shop_struct* shop, char const* name) 
{ 
    strncpy(shop->product[n].name, name, CMAX); 
} 

int main() 
{ 
    shop_struct shop = {0}; 
    strcpy(shop.product[0].name, "product0"); 
    puts(shop.product[0].name); //prints product0 
    rename_at(0,&shop,"new_product0"); 
    puts(shop.product[0].name); //prints new_product0 


} 
+0

Это работает, но почему не работает регулярная strcpy? – Karl

+0

Он делает. 'strncpy' является' strcpy' с проверкой длины, но ничто не мешает вам использовать неконтролируемый 'strcpy'. – PSkocik

+0

Спасибо за помощь. Я только узнал, что я массивный идиот, который не может справиться с циклами, поэтому моя проблема не в том, чтобы копировать после ... Извините, если я потратил ваше время. – Karl

 Смежные вопросы

  • Нет связанных вопросов^_^