• Najnowsze pytania
  • Bez odpowiedzi
  • Zadaj pytanie
  • Kategorie
  • Tagi
  • Zdobyte punkty
  • Ekipa ninja
  • IRC
  • FAQ
  • Regulamin
  • Książki warte uwagi

Wskaźniki programowanie język c

Aruba Cloud - Virtual Private Server VPS
0 głosów
154 wizyt
pytanie zadane 2 grudnia 2024 w C i C++ przez adam234345 Początkujący (400 p.)

Witam, program co prawda działa jak powinien, ale na końcu wyświetla, że gdzieś jest błąd, mógłby mi ktoś napisać gdzie dokładnie? z góry dzięki

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>



int main()
{


    int n;
    printf("Podaj n\n");
    scanf("%d", &n);


	int **p, suma=0,sumaprawej=0;
    p=(int**)malloc(n*sizeof(int*));

    for(int i=0; i<n; i=i+1)
    {
       *(p+i)=(int*)malloc(n*sizeof(int));

          for(int j=0; j<n; j=j+1)
    {
        *(*(p+i)+j)=(int**)malloc(n*sizeof(int*));
    }
    }



	for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {
        *(*(p+i)+j)=(i+1)*(j+1);
        printf("%3.d ", *(*(p+i)+j) );
    }
        printf("\n");
    }


    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {

         if(i==j)
        {
            suma=suma+*(*(p+i)+j);
        }

    }
    }


    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {

        if(i==(n-1-j) || i==j==n)
        {
            sumaprawej=sumaprawej+*(*(p+i)+j);
        }
    }
    }

    printf("Suma na przekatnej lewej: %d\n", suma);
    printf("Suma na przekatnej prawej: %d\n", sumaprawej);






    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {
       free(*(*(p+i)+j));
    }
    }



    for(int i=0; i<10; i=i+1)
    {
        free(*(p+i));
    }

    free(p);





    return 0;
}


 

2 odpowiedzi

0 głosów
odpowiedź 2 grudnia 2024 przez adrian17 Mentor (352,580 p.)

To nie wygląda zbyt sensownie. (przy okazji popraw sobie formatowanie, bo tak to nie jest zbyt czytelne)

Po pierwsze, masz ostrzeżenia od kompilatora:

main.c: In function ‘main’:
main.c:19:23: warning: assignment makes integer from pointer without a cast [-Wint-conversion]
       *(*(p + i) + j) = (int **)malloc(n * sizeof(int *));

I faktycznie, już pierwszych kilka linii jest dziwnych:

Najpierw na linii 18 alokujesz tablicę wskaźników na int, ok.

Potem na linii 22 do każdego elementu tablicy przypisujesz wskaźnik na nową tablicę N intów, OK.

A potem na linii 26 do każdego elementu tablicy intów przypisujesz... wskaźnik na nową tablicę N wskaźników na int?

Nie wiem co ta linia 26 ma robić. To koniec końców ma być łącznie tablica dwuwymiarowa, trójwymiarowa, czterowymiarowa...?

Z późniejszego kodu wnioskuję że miała być dwuwymiarowa, ale jeśli tak, to zrobiłeś o jedną za dużo warstwę malloc/free.

(plus jeszcze na samym końcu masz pętlę która robi się 10 razy, mimo że wszystkie inne zależą od N)

komentarz 2 grudnia 2024 przez adrian17 Mentor (352,580 p.)
A swoją drogą, zamiast `*(*(p + i) + j)` pisz normalnie `p[i][j]` :P
komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)

Miała być dwuwymiarowa oczywiście, linie 26 jest zbędna, ale dalej jest bląd

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>



int main()
{


    int n;
    printf("Podaj n\n");
    scanf("%d", &n);


	int **p, suma=0,sumaprawej=0;
    p=(int**)malloc(n*sizeof(int*));

    for(int i=0; i<n; i=i+1)
    {
       *(p+i)=(int*)malloc(n*sizeof(int));
    }



	for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {
        *(*(p+i)+j)=(i+1)*(j+1);
        printf("%3.d ", *(*(p+i)+j) );
    }
        printf("\n");
    }


    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {

         if(i==j)
        {
            suma=suma+*(*(p+i)+j);
        }

    }
    }


    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {

        if(i==(n-1-j) || i==j==n)
        {
            sumaprawej=sumaprawej+*(*(p+i)+j);
        }
    }
    }

    printf("Suma na przekatnej lewej: %d\n", suma);
    printf("Suma na przekatnej prawej: %d\n", sumaprawej);






    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {
       free(*(*(p+i)+j));
    }
    }



    for(int i=0; i<10; i=i+1)
    {
        free(*(p+i));
    }

    free(p);





    return 0;
}


 

komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)

@adrian17, na lekcjach  profesor używał takiego zapis, nawet nie wiedziałem, że można to w taki sposób zapisać

  

komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)

@adrian17, ok udało mi się usunąć błąd, chodziło o zwalnianie p, 

#include<stdio.h>
#include<stdlib.h>
#include<math.h>
#include<time.h>



int main()
{



    int n;
    printf("Podaj n\n");
    scanf("%d", &n);


	int **p, suma=0,sumaprawej=0;
    p=(int**)malloc(n*sizeof(int*));

    for(int i=0; i<n; i=i+1)
    {
       *(p+i)=(int*)malloc(n*sizeof(int));
    }



	for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {
        *(*(p+i)+j)=(i+1)*(j+1);
        printf("%3.d ", *(*(p+i)+j) );
    }
        printf("\n");
    }


    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {

         if(i==j)
        {
            suma=suma+*(*(p+i)+j);
        }

    }
    }


    for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {

        if(i==(n-1-j) || i==j==n)
        {
            sumaprawej=sumaprawej+*(*(p+i)+j);
        }
    }
    }

    printf("Suma na przekatnej lewej: %d\n", suma);
    printf("Suma na przekatnej prawej: %d\n", sumaprawej);




   for(int i=0; i<n; i=i+1)
    {
        free(*(p+i));
    }

    free(p);






    return 0;
}


tylko teraz mam pytanie czy to zwalnienie napisałem prawidłowo? 

komentarz 2 grudnia 2024 przez adrian17 Mentor (352,580 p.)
Zwalnianie na oko tak (choć by mogło być znowu z `p[i]`).

A, no i `i==j==n` jest błędne, nie ma takiego łączenia porównywania.

I formatowanie wydaje się być coraz gorsze :( Jakby co, praktycznie każdy edytor ma coś wbudowanego do czyszczenia tego.
komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)
niby błędne natomiast działa poprawnie
komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)
(i==j && i==n), w taki sposób pewnie należało to zapisać
0 głosów
odpowiedź 2 grudnia 2024 przez reaktywny Nałogowiec (46,230 p.)
for(int i=0; i<n; i=i+1)
    {
        for(int j=0; j<n; j=j+1)
    {
 
         if(i==j)
        {
            suma=suma+*(*(p+i)+j);
        }
 
    }
    }

jeśli liczysz tylko gdy i jest równe j to wystarczy jedna pętla

komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)
nie do końca rozumiem jak, gdy usunę jakąś to program nie będzie działa z braku int
komentarz 2 grudnia 2024 przez reaktywny Nałogowiec (46,230 p.)
Dwie pętle zastąpisz jedną.
komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)
co wtedy zamiast i==j?, po prostu i==i?
komentarz 2 grudnia 2024 przez reaktywny Nałogowiec (46,230 p.)
p[i][i] ?

Podobne pytania

+1 głos
1 odpowiedź 415 wizyt
pytanie zadane 7 maja 2023 w C i C++ przez kwkstein Nowicjusz (150 p.)
0 głosów
1 odpowiedź 586 wizyt
pytanie zadane 30 listopada 2022 w C i C++ przez Pysa6 Nowicjusz (220 p.)
0 głosów
1 odpowiedź 737 wizyt
pytanie zadane 3 października 2021 w C i C++ przez kevinbarakuda888 Nowicjusz (120 p.)

93,327 zapytań

142,323 odpowiedzi

322,396 komentarzy

62,657 pasjonatów

Motyw:

Akcja Pajacyk

Pajacyk od wielu lat dożywia dzieci. Pomóż klikając w zielony brzuszek na stronie. Dziękujemy! ♡

Oto polecana książka warta uwagi.
Pełną listę książek znajdziesz tutaj

Wprowadzenie do ITsec, tom 1 Wprowadzenie do ITsec, tom 2

Można już zamawiać dwa tomy książek o ITsec pt. "Wprowadzenie do bezpieczeństwa IT" - mamy dla Was kod: pasja (użyjcie go w koszyku), dzięki któremu uzyskamy aż 15% zniżki! Dziękujemy ekipie Sekuraka za fajny rabat dla naszej Społeczności!

...