2016-05-15 16 views
8

Zastanawiam się, czy istnieje sposób na stworzenie tablicy wskaźników wskazujących na pierwszą kolumnę każdego wiersza w wielowymiarowej tablicy liczb całkowitych. Jako przykład, proszę spojrzeć na poniższy kod:Tablice wskaźników, które wskazują na tablice liczb całkowitych

#include <stdio.h> 

int day_of_year(int year, int month, int day); 

main() 
{ 
    printf("Day of year = %d\n", day_of_year(2016, 2, 1)); 
    return 0; 
} 

static int daytab[2][13] = { 
    {0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

int day_of_year(int year, int month, int day) 
{ 
    int leap; 
    int *nlptr = &daytab[0][0]; 
    int *lpptr = &daytab[1][0]; 
    int *nlend = nlptr + month; 
    int *lpend = lpptr + month; 

    leap = year % 4 == 0 && year % 100 != 0 || year % 400 == 0; 
    if (leap) 
     for (; lpptr < lpend; lpptr++) 
      day += *lpptr; 
    else 
     for (; nlptr < nlend; nlptr++) 
      day += *nlptr; 
    return day; 
} 

Kiedy piszę jak ten poniżej:

int *p[2]; 
*p[0] = daytab[0][0]; 
*p[1] = daytab[1][0]; 

pojawia się błąd jak poniżej:

Error: Array must have at least one element 
Error: Variable 'p' is initialized more than once 
Error: { expected 
Error: Variable 'p' is initialized more than once 
Error: { expected 
***5 errors in Compile*** 

Zmieniłem go jak to:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

Nadal otrzymuję ten sam błąd.

Wiem, że możemy zrobić tablicę wskaźników do ciągów znaków, jak w poniższym przykładzie:

char *str[] = { 
    "One", "Two", "Three", 
    "Four", "Five", "Six", 
    "Seven", "Eight", "Nine" 
} 

Jak to robimy dla tablic liczb całkowitych?

+0

"* To nie działa *" jest mniej więcej wart raport o błędzie można dać. Dokładniej opisz błąd, ostrzeżenie, nieprawidłowe działanie, obserwuj! – alk

+2

Pierwszy przykład: duża szansa na spowodowanie usterki segmentacji poprzez usunięcie nieprawidłowego wskaźnika Drugi przykład: Czy mógłbyś wyjaśnić, co masz na myśli przez "nie działa"? – MikeCAT

+1

Kod jak pokazano (przy użyciu drugiego podejścia) wygląda mi dobrze. – alk

Odpowiedz

2

Twój kod powinien działać jak czar:

int *p[2]; 
p[0] = &daytab[0][0]; 
p[1] = &daytab[1][0]; 

printf("%d \n", p[0][2]); // shows: 28 
printf("%d \n", p[1][2]); // shows: 29 

Działa to również:

int *p[2] = { &daytab[0][0],&daytab[1][0] }; 
+0

Poprzedni kod, po skompilowaniu, nadal daje mi błędy, które wspomniałem powyżej, choć myślę, że nie powinien. Ale ta ostatnia działa dla mnie i sprawiła, że ​​program stał się bardziej zwarty, eliminując potrzebę, jeśli-else. Dziękuję Ci. –

+0

Ten ostatni kod działa, gdy skompiluję go jako cpp. Ale kiedy skompiluję go jako c, pojawia się błąd 'Nielegalna inicjalizacja w funkcji day_of_year' w linii' int * pe [2] = {p [0] + miesiąc, p [1] + miesiąc}; '. –

+1

Jak już wspomniano w Alk, uaktualnij swój kompilator tak szybko, jak to możliwe !. Był przestarzały w latach 90-tych i na pewno sprawi ci dużo bólu głowy. – tomekpe

1

Jeśli chodzi o zmianę definicji daytab iść jak 3rd przykład może chcesz korzystać z tego:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31} 
}; 

zamiast tego.

Albo pozostać zapisać i zaznaczyć koniec tablicy za pomocą Sentinel zrobić:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, 
    NULL 
}; 

lub^2 pozostać nawet wygaszacz znakowania również wewnętrzna tablica kończy:

int * daytab[] = { 
    (int[]){0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    (int[]){0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31, -1}, 
    NULL 
}; 

Uwaga że użyte tu związki ((Type){Initialiser}) są dostępne tylko od C99.

1

Użyj jak poniżej

int *p[2]; p[0] = daytab[0]; p[1] = daytab[1];