Why my code sometimes prints trash and other times not?

  • Thread starter Thread starter GustavoGG
  • Start date Start date
  • Tags Tags
    Code
AI Thread Summary
The discussion centers on a coding issue where the program sometimes outputs garbage values due to improper data type handling in C. The original code defines complex numbers incorrectly, leading to memory mismanagement when using `scanf`. It is suggested to define the variables as simple floats for the real and imaginary parts to align with the expected input format. The importance of compiling with warnings enabled is emphasized to catch potential type mismatches. Additionally, a historical perspective on complex number representation in C is provided, highlighting the evolution from structs to built-in complex types.
GustavoGG
Messages
2
Reaction score
0
TL;DR Summary
Im tring to use the library complex.h in C, but at the moment of compile and run it, the firsts times prints trash and then it runs well but after that one, again prints trash and thus, and i dont if the problem is with my computer or whats going on?
I send the next code to a friend and it runs him perfectly but not to me.
C:
#include<stdio.h>
#include<math.h>
#include<complex.h>
int main(){

    float complex a,b,x=2,y,z;
    printf("Write the real part followed by the imaginary part of your complex number: \n");
    scanf("%f %f",&a,&b);
    z=a+I*b;
    printf("z= %f + i%f\n",creal(z),cimag(z));
    y=cpow(z,x);
    printf("z2= %f + i%f\n",creal(y),cimag(y));

    return 0;
}

<< Mentor Note -- code tags added >>
 
Technology news on Phys.org
why not define a and b as float values only?

float a,b;
float complex x=2,y,z;

to be consistent with the scanf format of "%f %f"

What I think is happening is that defining A and B to be float complex makes A and B each have an 8 byte memory location ie 4 bytes for the real part and four bytes for the imaginary part.

The scanf is reading in your data and converting your first text value to a four byte float to go into the real part of A and the second text value is converted into a four byte float for the real part of B meaning that imaginary parts of A and B are whatever is in memory when you program begins (ie memory is not always zeroed at startup).
 
Last edited:
  • Informative
  • Love
Likes anorlunda and GustavoGG
Thanks it worked perfectly.
I did not know what you just explained but its clear and now I get it
 
Always compile with -Wall (or the "All Warnings" equivalent.)

Most compiles can do checks for type correctness on printf, scanf... even though they don't have to.

Put this code into your IDE
Code:
printf("%s %f %d %s", 1.0f, "Hello", (void*)0);
This code is perfectly valid C even though none of the types match and it doesn't even have right number of arguments, will compile, will also crash. Tweak your preferences until your IDE complains about this line.
 
One way early C programs used to define a complex number was to use a typedef struct:

C:
typedef struct COMPLEX {
    float real;
    float imag;
} complex:

complex x;

void main() {

    complex x;

    // INITIALIZING x
    x.real = 30.0;
    x.imag = 40.0;

    scanf(stdin,"%f %f", x.real, x.imag);

    printf("complex number: %10.4f +  %10.4fi", x.real, x.imag);
}

Of course, designers would add macros to handle setting values and basic arithmetic operations (like vectors) and working with the complex struct. Later compiler designers would extend these notions to handle complex numbers as part of our more modern languages.
 
Dear Peeps I have posted a few questions about programing on this sectio of the PF forum. I want to ask you veterans how you folks learn program in assembly and about computer architecture for the x86 family. In addition to finish learning C, I am also reading the book From bits to Gates to C and Beyond. In the book, it uses the mini LC3 assembly language. I also have books on assembly programming and computer architecture. The few famous ones i have are Computer Organization and...
I had a Microsoft Technical interview this past Friday, the question I was asked was this : How do you find the middle value for a dataset that is too big to fit in RAM? I was not able to figure this out during the interview, but I have been look in this all weekend and I read something online that said it can be done at O(N) using something called the counting sort histogram algorithm ( I did not learn that in my advanced data structures and algorithms class). I have watched some youtube...
Back
Top