Tablica dwuwymiarowa i funkcja srand

0

Czemu program nie działą prawidłowo, chodzi o instrukcje wskazana

#include <stdio.h>
#include <time.h>
#include <stdlib.h>
#include <string.h>
#define W 8
#define K 12
int i, j;
void uzupelnij_wyswietl(char[][K]);

int main(void)
{
    char tablica[W][K];
    uzupelnij_wyswietl(tablica);
    srand(time(NULL));

    return 0;
}

void uzupelnij_wyswietl(char tab[][K])
{
    char tmp;
    for (i = 0; i < W; ++i)
        for (j = 0; j < K; ++j) {
            tmp = rand() % 200 + 1;
            tab[W][K] = isdigit(tmp) ? tmp : j--; // <-- tu o tutaj
        }

    for (i = 0; i < W; ++i) {
        puts("\n");
        for (j = 0; j < K; ++j)
            printf("%c ", tab[W][K]);
    }
}

1

tab[W][K] = czyli w pętli próbujesz zapisać po za obszarem tablicy.

Ponadto, brakuje Ci dołączenia pliku <ctype.h>, a funkcję srand() inicjalizujesz po wywałaniach rand() zamiast przed nimi. Zmienne i, j chyba nie muszą być globalne?

0

pozowle sobie to jescze umieścić, jakim cudem po powrocie z funkcji wartość 0 elementu tablicy to 4 ??

#include <stdio.h>
#include <stdlib.h>
void f(float* x, float* y)
{

    *y = --*x;
    x = y;
    ++*x;
    printf("x=%f\n", *x);
    printf("y=%f\n", *y);
}
int main(void)
{
    float *tab, *x;
    tab = (float*)malloc(2 * sizeof(float));
    tab[0] = 5;
    x = &*(tab + 1);
    f(tab, x);

    printf("%.1f %.2f", tab[0], tab[1]);
    return 0;
}
1

Cześć,
Spójrz na to krok po kroku:

    tab[0] = 5;
    x = &*(tab + 1);

Zerowy element tablicy ma wartość 5, natomiast wskaźnik x wskazuje na pierwszy element tablicy.
Teraz namieszałeś:

    *y = --*x;    /* Wyłuskanie pierwszego elementu y i wpisanie tam wartości o jeden mniejszą niż wyłuskana z x czyli 4! */
    x = y;        /* x wskazuje na pierwszy element y, czyli 4. */
    ++*x;         /* Zwiększasz wartość na którą wskazuje x */

Jednak ten fragment:

    x = y;
    ++*x; 

Sprawia, że przekopiowujesz pamięć do wskaźnika x, więc cokolwiek robisz ze wskaźnikiem x pozostaje w x, natomiast tab zaczyna wskazywać na inny adres. Po powrocie z funkcji lokalne wtedy tab, czyli x znów wskazuje na to co przed wejściem do funkcji, więc znów jest tam wartość 4.
Po pierwsze: Prześledź sobie całość debuggerem, na pewno masz taką możliwość. ;)
Po drugie: Beznadziejnie nazwałeś argumenty funkcji, w miejsce oznaczone jako x wrzucasz tab, a w miejsce oznaczone jako y wrzucasz x. Wszystko się wtedy myli i tym trudniej prześledzić zachowanie kodu...

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