Dynamiczna alokacja tablic - błąd przy wyświetlaniu danych.

0
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ROZMIAR 81
void pomin(void);
int main(void)
{
    char temp [MAX_ROZMIAR];
    char (* wsd) [MAX_ROZMIAR];
    int max;
    int liczba;
    int i = 0;
    int j;

    puts("Ile wynosi maksymalna liczba tytulow?");
    scanf("%d", &max);
    pomin();
    wsd = calloc(max, sizeof(char) * MAX_ROZMIAR);//Działa dobrze, lecz do jakiego typu powinienem rzutować? (char*) oraz (char**) wywalają ostrzeżenia
    if(wsd == NULL)
    {
        puts("Blad przydzialu pamieci. Do widzenia.");
        exit(EXIT_FAILURE);
    }
    puts("Wpisuj kolejne wartosci (By zakonczyc, wpisz pusty wiersz):");
    while(i < max && gets(wsd[i]) != NULL && wsd[i][0] != '\0' && wsd[i][0] != '\n')//Jeśli w tej pętli wypisuję dane instrukcją puts(wsd[i]); to wypisuje poprawnie
        i++;
    printf("Oto lista %d pozycji:\n", liczba = i);
    for(i = 0; i < liczba; i++);
        puts(wsd[i]);//W tym miejscu wypisuje niepoprawnie
    puts("Koniec");
    free(wsd);
    return 0;
}
void pomin(void)
{
    while(getchar() != '\n');
}
 

Pytania w kodzie.

2

Mylą ci się cztery pojęcia:

  1. char - jeden pojedynczy znak;
  2. napis - ciąg znaków zakończony znakiem '\0' przeważnie pakowany do jakieś tablicy znaków;
  3. tablica napisów - tablica każdy element której jest tablicą zawierającą napis;
  4. wskaźnik do tablicy zawierającej napis - bardzo rzadko używany twór (aczkolwiek przydatny) którego próbujesz użyć zamiast tablicy napisów.
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MAX_ROZMIAR 81

int main()
  {
   char temp[MAX_ROZMIAR];
   char *wsd[MAX_ROZMIAR];
   int max,len,i;

   puts("Ile wynosi maksymalna liczba tytulow: ");
   scanf("%d",&max);
   while(getchar()!='\n') {}
   wsd=(char*)calloc(max,sizeof(char*));
   puts("Wpisuj kolejne wartosci (By zakonczyc, wpisz pusty wiersz):\n");
   i=0;
   while((i<max)&&(fgets(temp,MAX_ROZMIAR,stdin))&&(*temp!='\n'))
     {
      len=strlen(temp);
      wsd[i]=(char*)calloc(len,1);
      memcpy(wsd[i++],emp,len-1);
     }
   max=i;
   printf("Oto lista %d pozycji:\n",max);
   for(i=0;i<max;++i) puts(wsd[i]);
   puts("Koniec");
   for(i=0;i<max;++i) free(wsd[i]);
   free(wsd);
   return 0;
  }

Uwaga, pisano z palca bez sprawdzenia mogą być błędy

0

Hej, Co do rzutowania to wsd jest typu: wskaźnik do tablicy o MAX_ROZMIAR elementach, i do takiego typu powinieneś rzutować.

wsd = (char(*)[MAX_ROZMIAR]) calloc(max, max * sizeof(char) * MAX_ROZMIAR);
0

sorki za double posta, mam nadzieje ze moderator sklei z poprzednim.
Przy wypisywaniu wywal srednik zza fora.

masz:

for(i = 0; i < liczba; i++);
        puts(wsd[i]); 

a powinno być:

for(i = 0; i < liczba; i++)
        puts(wsd[i]); 
1

Dopiero się uczę C++ z lekkimi odchyleniami do C. Ale, czy nie lepiej byłoby:

char * wsd;

wsd = malloc(zadany_rozmiar + 1); //+1, żeby przechować sobie NULL

Po co taka deklaracja: *wsd [] ?

Zresztą tu jest artykuł, który sugeruje to, co ja uważam: Calloc

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