2015-01-10 3 views
1

Я пытаюсь напечатать элементы структуры Task, но это только печать первого элемента, а затем он дает мне ошибку сегментации. Может ли кто-нибудь мне помочь?Не удается распечатать struct

Это мой код:

void listartarefas(Task *ff) 
{ 
int i; 
for(i=0;i<=1;i++) 
    { 
    if(ff[i].tipo == 1) 
     { 
     printf("Agendada:\n"); 
     printf("%d\n",ff[i].identf); 
     printf("%s\n",(ff[i].path)); 
     printf("%d-%d-%d\n",(ff[i].ano),(ff[i].mes),(ff[i].dia)); 
     printf("%d:%d:%d\n",(ff[i].hora),(ff[i].minuto),(ff[i].segundo)); 
     } 
    else 
     { 
     printf("Executada:\n"); 
     printf("%d\n",ff[i].identf); 
     printf("%s\n",(ff[i].path)); 
     printf("%d-%d-%d\n",(ff[i].ano),(ff[i].mes),(ff[i].dia)); 
     printf("%d:%d:%d\n",(ff[i].hora),(ff[i].minuto),(ff[i].segundo)); 
     } 
    } 
} 

int main() 
{ 
Task tf={2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22}; 
Task tt={3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44}; 

Task *ff[]={&tf,&tt}; 

listartarefas(*ff); 
return 0; 
} 

ответ

0

Проблема здесь

listartarefas(*ff); 

Вы пропусканием косвенность из * фф [], который является первым элементом массива что вы намерены пройти. Возможно, вы захотите сделать это:

void listartarefas(Task **ff) 
{ 
int i; 
for(i=0;i<=1;i++) 
    { 
    if(ff[i]->tipo == 1) 
     { 
     printf("Agendada:\n"); 
     printf("%d\n",ff[i]->identf); 
     printf("%s\n",(ff[i]->path)); 
     printf("%d-%d-%d\n",(ff[i]->ano),(ff[i]->mes),(ff[i]->dia)); 
     printf("%d:%d:%d\n",(ff[i]->hora),(ff[i]->minuto),(ff[i]->segundo)); 
     } 
    else 
     { 
     printf("Executada:\n"); 
     printf("%d\n",ff[i]->identf); 
     printf("%s\n",(ff[i]->path)); 
     printf("%d-%d-%d\n",(ff[i]->ano),(ff[i]->mes),(ff[i]->dia)); 
     printf("%d:%d:%d\n",(ff[i]->hora),(ff[i]->minuto),(ff[i]->segundo)); 
     } 
    } 
} 

int main() 
{ 
    Task tf={2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22}; 
    Task tt={3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44}; 

    Task *ff[]={&tf,&tt}; 

    listartarefas(ff); 
    return 0; 
} 
+0

Привет! Ваш ответ действительно помог мне, но я знаю, что у меня есть вопрос: что, если я хочу передать «Задачу * ff»? Что мне нужно изменить внутри функции? Потому что, если я ничего не меняю, он не печатает то, что я хочу – user123

+0

Здравствуйте, Я рад слышать ответ. Не могли бы вы подробнее рассказать о том, чтобы я хорошо понял проблему? Возможно, вы можете опубликовать пример того, как вы хотите, чтобы вызов объявления функции был, и где вам нужно изменить данные. –

3

Потому что вы не передаете указатель на массив в listartarefas функции. вместо этого вы разыгрываете массив, который дает вам только первый элемент, который является указателем на одну структуру , и вы выполняете цикл, как это было два, что приводит к [неопределенным поведением} (http://en.wikipedia.org/wiki/Undefined_behavior).

В коде есть несколько странных вещей, например, у вас есть массив указателей, а не просто массив структур, что означает, что вам нужно либо изменить свою функцию, чтобы принять массив указателя, либо изменить массив от массива указателей до массива структур.

Моя рекомендация - использовать массив структур и просто передать его как есть, потому что массивы естественно разлагаются на указатели. Так, например,

Task ff[] = { 
    {2,1,"home/fsm/mieti/projB/Makefile",17,20,00,1,5,22}, 
    {3,0,"home/fsm/mieti/projB/Makefile",17,22,34,1,4,44} 
}; 

listartarefas(ff); 
0
listartarefas(*ff); 

Так этот вызов эквивалентен

listartarefas(ff[0]); 

Теперь то, что вы передаете это первый элемент массива ff, который является указателем на структуру. В этой функции вы пытаетесь получить доступ к ff[1], чтобы вы увидели сбой.

Вы можете сделать что-то вроде того, что @Joachim как предложено

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