problem windows vs. linux allgemein Fragen



  • Hi,

    hab ein programm unter Windows mit Dev-C++ geschrieben jetzt wollte ich das ganze unter linux compilieren und bekomme dabei erst mal massig warnungen was nicht weiter schlimm ist. Was aber ärgerlich ist das mir folgende Fehler angezeigt werden mit denen ich nichts anfangen kann hoffe mir kann jemand helfen.

    Hier die erste Fehlermeldung:
    undefined reference to `sqrt'

    long int primzahl() {
            	// Variablendefinition - belegung
            	   long int a;          //Hier wird die wahrscheinliche Primzahl gespeichert
            	   int i;               //Zaehlvariable
            	   int flag;            //einfache entscheidungs - variable
    
                // Voreinstellung fuer das ermitteln der Zuffalszahl
                   srand(time(0));
    
                // Ermitteln der Primzahl beginnt mit abarbeitung der Schleife
                	do {
                        // entscheidungsvariable zuruecksetzten
                		   flag = 0;    
                		// Zufallszahl ermitteln 
                		   a =rand()%400+1;
                		// prüfen ob es eine Primzahl ist 
                		   if (a % 2 == 0) {
     	                       flag = 1;
                           }
         	            // Versuche variable a mit den ungeraden Zahlen von 3 bis sqrt(a) zu teilen!  
         	               for (i = 3; i <= sqrt(a); i = i + 2) {  // Hier soll der Fehler sein
                    	       if (a% i == 0) { //Teilertest
                    	          flag = 1;
                 	           }
               	            }
         	            // Wenn es hier rausgeht dann ist a eine Primzahl
                	}while (flag == 1); 
            	// Rueckgabe der Primzahl
                   return a;           
            }
    

    Hier die zweite Fehlermeldung:
    undefined reference to `pow'

    int bintochar(char c[]) {
                // Variablendeffinition -belegung
               	   int i;
               	   int ret = 0;
    
                // Uwandeln mit Zaehlschleife
                   for (i=0;i<KEYLAENGEMERKLE;i++){
                       if (c[i]=='1'){
                          ret += (int)pow(2, (KEYLAENGEMERKLE - i - 1)); // Hier ist der Fehler 
                       }
                   }
                   return ret;
            }
    

    An den Headerdatein kann es eigentlich nicht liegen da ich folgende eingebunden habe:

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



  • Mit dem Compiler 'gcc' musst du in C ein '-lm' anhängen, um die Mathe-Sachen zu linken.



  • ok probier ich dann mal gleich aus hätte aber noch eine frage zu einer warnung die ich bekomme die warnung lautet:
    warning: format ‘%[^

    die dazugehörige code zeile lautet:

    scanf("%254[^\n]", &pfad);
    

  • Mod

    Was ist pfad und was ist die vollständige Warnung? Falls pfad irgendeine Form von char-Array ist, dann gehört da kein & hin und der Compiler wird vermutlich warnen, dass er char* erwartet, aber *char[irgendwas] bekommen hat.



  • Angenommen, Du arbeitest mit einem char-Array:

    char array[100];
    

    Der Ausdruck array ist dann äquivalent zu &array[0] und steht für die Adresse des Char-Arrays. Insofern brauchst Du keinen Adress-Operator davor für scanf, weder in Windows noch in Linux.


  • Mod

    PrettyY schrieb:

    Der Ausdruck array ist dann äquivalent zu &array[0]

    Ja.

    und steht für die Adresse des Char-Arrays.

    Eben nicht. Die Adresse des ersten Elementes ist vom Typ Zeiger auf char, die Adresse des Arrays (also &array) ist vom Typ Zeiger auf char-Array. Der Zahlenwert des Pointers wird in beiden Fällen der gleiche sein (ich bin mir sogar ziemlich sicher, dass der Standard dies garantiert, müsste ich aber gucken), der Compiler sieht aber den Unterschied zwischen den Typen, wenn er hier die Syntax von scanf kontrolliert.



  • char array[100];

    array[0] steht für den ersten char im Array "array" und &array[0] steht für die Adresse des Pointers auf den ersten char im Array "array".
    Zerstör nicht mein mühsam aufgebautes Halbwissen!
    Sicherlich sind &array und array nicht identisch, zumindest nicht typgleich. Aber ich sprach auch von array und &array**[0]**

    Ich hab mich natürlich nicht korrekt ausgedrückt, aber ich bin ziemlich sicher, wir meinen das Gleiche 🙂


  • Mod

    Doch, du hast recht, array und &array[0] sind (zumindest in vielen Kontexten) identisch. Aber es sind (vom Typ her) Zeiger auf das erste Element, nicht Zeiger auf das Array, wie du behauptet hattest.



  • Dann sind wir uns zumindest einig 🙂
    Danke für die Aufklärung


Anmelden zum Antworten