[C] Dynamiczna alokacja pamięci.Tablica,liczby zespolone.

BlackMath
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 3 paź 2012, o 18:39
Płeć: Mężczyzna
Lokalizacja: Gdynia

[C] Dynamiczna alokacja pamięci.Tablica,liczby zespolone.

Post autor: BlackMath »

Witam. Mam problem z jednym programem. Mam w nim alokować tablicę jednowymiarową dynamiczną typu double complex, wczytać i wydrukować. Poniżej wklejam kod. Po odpaleniu i wpisywaniu liczb program crashuje. Podejrzewam, że problem może leżeć przy wczytywaniu, ale nie mogę się go doszukać.

Kod: Zaznacz cały

#include <stdio.h>
#include <stdlib.h>
#include <complex.h>
int main(int argc, char *argv[])
{
    int k,n,i;
    
    do
    {
        printf("
Podaj rozmiar tablicy:");
        k=scanf("%d",&n);
        fflush(stdin);
        }while(k==0||n<1);
        
    
    double _Complex *pz;
    
    pz=(double _Complex *)calloc(n,sizeof(double _Complex));
    for(i=0;i<n;i++)
    {
                    do{
                        printf("
Podaj liczbe z[%d]=",i);
                        k=scanf("%lf %lf",__real__ (pz+i),__imag__ (pz+i));
                        fflush(stdin);
                        }while(k==0);
                    
                    }
   for(i=0;i<n;i++)
   printf("
z[%d]=%lf + j%lf",i,__real__ *(pz+i),__imag__ *(pz+i));                 
                  
             
  system("PAUSE");	
  return 0;
}
Ostatnio zmieniony 1 gru 2012, o 13:08 przez Afish, łącznie zmieniany 1 raz.
Powód: Poprawa wiadomości.
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C] Dynamiczna alokacja pamięci.Tablica,liczby zespolone.

Post autor: royas »

Spróbuj inaczej wczytywać te liczby:

Kod: Zaznacz cały

double re,im;
k=scanf("%lf %lf",&re,&im);
*(pz+i)=re+im*_Complex_I;
BlackMath
Użytkownik
Użytkownik
Posty: 4
Rejestracja: 3 paź 2012, o 18:39
Płeć: Mężczyzna
Lokalizacja: Gdynia

[C] Dynamiczna alokacja pamięci.Tablica,liczby zespolone.

Post autor: BlackMath »

Dzięki wielkie. Teraz wszystko działa. Potrafiłbyś mi wytłumaczyć dlaczego mój sposób był zły? A jak by było z wczytywaniem w przypadku tablicy dwuwymiarowej? Czy taki kod byłby odpowiedni?

Kod: Zaznacz cały

 double _Complex *pa[n],re,im;
   
   for(i=0;i<n;i++)
   pa=(double _Complex *)calloc(m,sizeof(double _Complex)); 
   
   for(i=0;i<n;i++)
                   for(j=0;j<m;j++)
                                   {
                                   do{
                                   printf("
Podaj element z[%d][%d]:",i,j);
                                   k==scanf("%lf%lf",&re,&im);
                                   pa[i][j]=re+I*im;
                                   fflush(stdin);
                                   }while(k==0);              
                   }
royas
Użytkownik
Użytkownik
Posty: 363
Rejestracja: 24 sie 2012, o 09:27
Płeć: Mężczyzna
Lokalizacja: Cieszyn
Pomógł: 80 razy

[C] Dynamiczna alokacja pamięci.Tablica,liczby zespolone.

Post autor: royas »

Tak dokładnie to nie wiem, ale problem był pewnie w tym, że po __real__ powinna być liczba complex, a nie wskaźnik. __real__ wskaznik nie daje wskaźnika do części rzeczywistej.

Można jeszcze próbować tak:

Kod: Zaznacz cały

k=scanf("%lf %lf",&(__real__ *(pz+i)),&(__imag__ *(pz+i)) );
Ale nie jestem pewny czy to jest przenośne.

Z dwuwymiarową tablicą nie wiedzę powodu dla którego miałoby być coś nie tak.
ODPOWIEDZ