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

Wskaźniki macierzy nie wyświetla liczby zero

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

Hej, nie mam pojęcia czemu liczba zero nie jest wyświetlana w macierzy, ilość zer natomiast działa dobrze, i nie mam pomysłu jak to naprawić, 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, ilezer=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)=-1+rand()%(2-(-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((*(*(p+i)+j))==0)
        {
            ilezer=ilezer+1;
        }
    }
    }


    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);
    printf("Ilosc zer: %d\n", ilezer);








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

    free(p);





    return 0;
}


 

komentarz 2 grudnia 2024 przez adrian17 Mentor (352,580 p.)
Na oko to ten "%3.d " wygląda podejrzanie, skąd to wziąłeś?
komentarz 2 grudnia 2024 przez adam234345 Początkujący (400 p.)
faktycznie, dziękuje bardzo
komentarz 2 grudnia 2024 przez WojAbuk Gaduła (3,000 p.)
Może jakiś opis co ten kod ma robić? Przydało by się też go podzielić na funkcje i zabezpieczyć przed sytuacją gdy malloc nie przydzieli pamięci.
komentarz 2 grudnia 2024 przez adrian17 Mentor (352,580 p.)

i zabezpieczyć przed sytuacją gdy malloc nie przydzieli pamięci

Może bez przesady :P

Ogólnie domyślam się że w zadaniu chodzi o ogólne nauczenie / przyzwyczajenie się do używania wskaźników, nie ma po co dodatkowo komplikować od razu dzieląc na funkcje, jedna rzecz na raz.

1
komentarz 2 grudnia 2024 przez mokrowski Mędrzec (158,200 p.)
Przyzwyczajenie do używania wskaźników, jak najbardziej powinno zawierać sprawdzenie NULL w takich przypadkach :) Ale daleki jestem co do uruchamiania świętej wojny o nic (czyli o NULL) :)

Poza tym, malloc(...) zwraca void * i w C nie trzeba rzutować. A wymaganie że "się w C++ w przyszłości przyda", od C++11 jest uczeniem złych nawyków.
komentarz 2 grudnia 2024 przez adrian17 Mentor (352,580 p.)

jak najbardziej powinno zawierać sprawdzenie NULL w takich przypadkach :) 

Ehh, w praktyce dla 99+% programów to nie jest potrzebne i ludzie się nie przejmują; jak już to ludzie robią to co inne języki, czyli aborta jak się nie uda i tyle. Można to owinąć w jakąś funkcję owijającą malloca i zapomnieć. (a przez overcommit na niektórych platformach i tak dostaniesz aborta czy tego chcesz czy nie, w dodatku nawet nie w momencie malloc()owania tylko losowo później).

Poza tym, malloc(...) zwraca void * i w C nie trzeba rzutować. A wymaganie że "się w C++ w przyszłości przyda", od C++11 jest uczeniem złych nawyków.

Nie wiem skąd ten temat o "uczeniu złych nawyków" się wziął, bo o tym nikt tutaj nie rozmawiał. Plus C++11 tutaj niczego nie zmienił, tak było od początku; plus w C++ie i tak nie powinieneś używać malloc()a, więc to wydaje się super nie na temat.

1
komentarz 2 grudnia 2024 przez mokrowski Mędrzec (158,200 p.)

@adrian17 Wybacz, nie zgadzam się. Ale ani to czas ani miejsce na przerzucanie się tak standardami, dobrymi praktykami jak i przypadkami szczególnymi.

komentarz 2 grudnia 2024 przez WojAbuk Gaduła (3,000 p.)

@adrian17, ciekawy jestem skąd wiozłeś to 99,9% i w przypadku C do zdecydowanie nie jest prawda. Jak bym miał strzelać to problem z brakiem pamięci może występować w 30% programów w języku C. Z mojej perspektywy to jest większość piszę albo symulacje fizyczne z operacjami na liczbach z miliardami cyfr lub kod, a wcześniej pisałem kod na mikrokontrolery gdzie miałem mocno ograniczoną pamięć, ale moja nisza to dwie skrajne dziedziny.

komentarz 2 grudnia 2024 przez adrian17 Mentor (352,580 p.)
edycja 2 grudnia 2024 przez adrian17
Przyznaję że z palca :) W zamiarze to miał być bardziej zabieg retoryczny, niż twarde stwierdzenie :/

I też zgadzam się że jak najbardziej są dziedziny gdzie znacząca większość przejmuje się użyciem pamięci, szczególnie embedded (ale z kolei w takich kontekstach często też w ogóle nie używasz malloca; również jak gdy jesteś pod jakimiś ostrzejszymi wymogami jak MISRA.).

Zaloguj lub zarejestruj się, aby odpowiedzieć na to pytanie.

Podobne pytania

0 głosów
1 odpowiedź 1,194 wizyt
pytanie zadane 31 marca 2020 w C i C++ przez MaTiDxxx Początkujący (290 p.)
0 głosów
4 odpowiedzi 521 wizyt
pytanie zadane 14 marca 2017 w PHP przez Chess Szeryf (76,730 p.)
0 głosów
1 odpowiedź 101 wizyt
pytanie zadane 2 grudnia 2024 w C i C++ przez adam234345 Początkujący (400 p.)

93,327 zapytań

142,323 odpowiedzi

322,397 komentarzy

62,658 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!

...