Przekazywanie tablicy wskaźników do funkcji

0

Siemka. Czy może mi ktoś powiedzieć, dlaczego liczby w kolumnach nie są takie same po skompilowaniu programu ?

#include <stdio.h>
#define GRAN 10
#define ROZMIAR 50
void ASCII(char*);
int main(void)
{
   char lan[GRAN][ROZMIAR];
    char * wsk[GRAN];
    int licznik = 0;

    while (licznik < GRAN && gets(lan[licznik]) && *lan[licznik] != '\0')
    {
        wsk[licznik] = lan + licznik;
        licznik++;
    }
    printf("%d   %d\n", wsk, wsk[1]);
    ASCII(wsk);
}
void ASCII(char* wsk)
{
    printf("%d   %d\n", wsk, wsk[1]);

}
 
0

co chciałeś osiągnąć? wrzucasz do wskaźnika na char podwójny wskaźnik na char, dodajesz do tego licznik... ale to nie wartość tylko adres... lan nie ma początkowych wartości... to nie ma prawa pokazać tego samego

0

A czego się spodziewasz? Próbujesz w printfie jako pierwszy element wyświetlić adres wskaźnika - raz będzie to adres pierwszego elementu, a w funkcji będzie to adres przekazanego wskaźnika.... Do wyświetlania adresów uzywaj jednak %p

edycja:
A w zasadzie to Typrzekazujesz jeszcze co innego w funkcji ASCII ten wsk oznacza jeszcze coś innego - ogólnie wywołaie tej funkcji jest błędne, albo definicja jest błędna...

0

No dobra, uwzględniając wasze uwagi zmieniłem sposób przypisywania do tablicy wsk oraz rodzaj argumentu pobieranego przez funkcję ASCII i teraz wszystko gra, tzn. Liczby w kolumnach są takie same.(użyłem %d zamiast %p gdyż adres zapisany w systemie dziesiętnym jest mi jakoś bardziej naturalny - to był świadomy zabieg :-) ) Kod wygląda teraz tak:

#include <stdio.h>
#define GRAN 10
#define ROZMIAR 50
void ASCII(int*);
int main(void)
{
   char lan[GRAN][ROZMIAR];
    char * wsk[GRAN];
    int licznik = 0;

    while (licznik < GRAN && gets(lan[licznik]) && *lan[licznik] != '\0')
    {
        wsk[licznik] = lan[licznik];
        licznik++;
    }
    printf("%d   %d\n", wsk, wsk[1]);
    ASCII(wsk);
}
void ASCII(int* wsk)
{
    int licznik = 0;
    int index;
    char *temp, *wsk1;
    printf("%d   %d", wsk, wsk[1]);
}
 

No ale jak chyba wspomniałem na początku(albo nie) jest to jakby fragment większego programu, w którym po zastosowaniu tych poprawek i tak program się wiesza. Zna ktoś może odp dla czego. Przyjmę każdą krytykę. Oto kod:

 #include <stdio.h>
#include <string.h>
#include <conio.h>
#define GRAN 10
#define ROZMIAR 50
void ASCII(int*);
int main(void)
{
    char lan[GRAN][ROZMIAR];
    char * wsk[GRAN];
    int licznik = 0;
  
    while (licznik < GRAN && gets(lan[licznik]) && *lan[licznik] != '\0')
    {
        wsk[licznik] = lan[licznik];
        licznik++;
    }
               ASCII(wsk);
        for (licznik = 0; *wsk[licznik] != '\0'; licznik++)
            puts(wsk[licznik]);
    }
    return 0;
}
}
void ASCII(int *wsk)
{
    int licznik = 0;
    int index;
    int *temp;

    for (;licznik < GRAN-1; licznik++)
    {
        for(index = licznik + 1; index < GRAN; index++)
        {
            if (strcmp(wsk[licznik], wsk[index]) > 0)
            {
                temp = wsk[licznik];
                wsk[licznik] = wsk[index];
                wsk[index] = temp;
            }
        }

    }
}
1

na sam początek masz problem ze wskaźnikami... do swojej funkcji podajesz tablicę wskaźników(podwójny wskaźnik) a funkcja jako argument przyjmuje pojedyńczy wskaźnik... to na pewno jest problem

0

Ok, ale nawet po uwzględnieniu twojej uwagi program się zawiesza. Niikelion, czy mógłbyś wstawić jakieś gotowe rozwiązanie problemu. Myślę, że wtedy by mi się wszystko rozjaśniło.

0

nie do końca rozumiem co ma robić ten program i trochę ciężko coś z tym zrobić, a co do samego kodu to niestety nie widzę problemu... ale jeszcze poszukam

0

Program ma segregować łańcuchy od A do Z.

1

tak na szybko:

void ASCII(char **wsk)
{
    int licznik = 0;
    int index;
    char *temp;
 
    for (;licznik < GRAN-1; licznik++)
    {
        for(index = licznik + 1; index < GRAN; index++)
        {
            if (strcmp(wsk[licznik], wsk[index]) > 0)
            {
                temp = wsk[licznik];
                wsk[licznik] = wsk[index];
                wsk[index] = temp;
            }
        }
 
    }
}

 

To co było tam napisane nie miało prawa się nawet skompilować! Dodatkowo - sortujesz wszystko, a powinno być sortowane tylko tyle elementów ile jest wpisane - tych poprawek nie robię. A strcmp warto zastąpić strncmp...

0

Dzięki kaczuś, o to właśnie chodziło.

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