Προς το περιεχόμενο

Προτεινόμενες αναρτήσεις

Δημοσ.

Καλησπέρα σας.

Έχω ένα project στην C με κάμποσες συναρτήσεις, και καθώς το κάνω compile μου βγάζει αυτά τα σφάλματα:

>  Error	3	error LNK1120: 2 unresolved externals	C:\Users\lab15\Documents\Visual_Studio_2010\Projects\Column Generator\Debug\Column Generator.exe	1
Error	2	error LNK2019: unresolved external symbol "double * * __cdecl callocDouble2d(int,int)" (?callocDouble2d@@YAPAPANHH@Z) referenced in function _main	C:\Users\lab15\Documents\Visual_Studio_2010\Projects\Column Generator\Column Generator\main.obj
Error	1	error LNK2019: unresolved external symbol "void __cdecl RevisedSimplexMethod(double *,double * *,double *,double *,int *,double *,double,int,int)" (?RevisedSimplexMethod@@YAXPANPAPAN00PAH0NHH@Z) referenced in function _main	C:\Users\lab15\Documents\Visual_Studio_2010\Projects\Column Generator\Column Generator\main.obj  

 

 

Σημειωτέον την main thn έχω ως main.cpp γιατί αν την βάλω main.c βγάζει ένα 1000000 λάθη που δεν έχουν λογική, πχ.. ότι σχεδόν όλα είναι undeclared ενώ είναι όλα οκ...

 

Αυτό το πράγμα δεν έχω καταφέρει ποτέ να το διορθώσω γι αυτό το κάνω σε .cpp αλλά αυτή την φορά μου έβγαλε αυτά τα μηνυματα...

 

Δεν ξέρω αν βοηθάει, αλλά να σας πώ ότι έχω και αρκετά header files στα οποία αποθηκεύω τα ορίσματα των συναρτήσεων, και το σώμα τους σε .c

 

 

καμία βοήθεια;;;;;;

 

το μόνο που βρήκα είναι να κάνω κάτι με το extend"C"{}

αλλά 1ο) δεν το καταλαβαίνω και 2ον) μου βγάζει σφάλμα syntax error 'string'

 

 

καμία βοήθεια;;;;

Δημοσ.

Aν κάποια αρχεία έχουν σήμανση *.c και κάποια άλλα *.cpp

έχεις ένα πρόγραμμα με ανάμικτο κώδικα της C και της C++.

 

Η σύνταξη των C και C++ έχει κάποιες διαφορές, όπερ σημαίνει ότι τα αρχεία τους

δεν μπορούν να αναμιχθούν άμεσα. Μια από αυτές είναι ο τρόπος που αναφέρονται τα

ονόματα των συναρτήσεων στον παραγόμενο οbject code (αρχεία *.obj):

στην περίπτωση της C++ τίθεται μπροστά από κάθε όνομα το πρόθεμα "__"

(γι αυτό και εν προκειμένω δεν τα βρίσκει).

 

Σε αυτές τις περιπτώσεις χρησιμοποιείται το keyword extend"C" για να

υποδείξει στον compiler να εφαρμόσει τις κατάλληλες σημάνσεις ώστε να καταστεί

δυνατή η σύνδεση (κλήση C κώδικα από C++).

 

Το κάθε αρχείο βέβαια πρέπει να μην έχει άλλα συντακτικά λάθη αλλιώς δεν θα δουλέψει.

Βεβαιώσου ότι τα επιμέρους αρχεία που χρησιμοποιείς είναι σωστά γραμμένα και - αν

επιμένεις στην ανάμιξη του κώδικα - δες πώς δουλεύει το extern"C".

 

 

Όσο για τα μηνύματα "undecrared" κλπ που λαμβάνεις όταν έχεις την κατάληξη

του αρχείου σε c, έχε κατά νου αυτό :

ενώ στην C++ οι δηλώσεις μεταβλητών μπορούν να είναι οπουδήποτε βολεύει,

στην C πρέπει να γίνονται μόνον στην αρχή του προγράμματος (άλλη μια διαφορά τους).

 

 

Πω πω τι βλέπω...αναθεωρημένη μέθοδος Simplex...

Τα έπαιζα στα δάχτυλά μου αυτά κάποτε...

 

-

Δημοσ.

Οι συναρτήσεις είναι όλες σωστές και δοκιμασμένες...

Εσυ δηλαδή μου λές μπροστά από το όνομα της συνάρτησης να βάλω το "_" πχ void _myfunction()

 

και στο κάλεσμα??? πάλι _myfunction ???

 

 

Δεν θα θελα να το κάνω όμως έτσι... Αυτό που με μπερδεύει πιο πολύ από όλα είναι ότι στην main, όταν την έχω se *.c γίνεται χαμός από τα λάθη.

 

 

>  int i,j,nrow, ncol,k;
double TC=0;
FILE*fp=fopen("rsm_data.txt","r");

fscanf(fp,"%d %d",&nrow,&ncol);

int *idxB=(int *)calloc(nrow,sizeof(int));
double **A=callocDouble2d(nrow,ncol);
double *c=(double*)calloc(ncol,sizeof(double));
 

 

 

και ενώ όλα αυτά είναι σωστά μου λέει παρακάτω ότι καμία μεταβλητή μου δεν είναι δηλωμένη. ??????????? Εγώ κυρίως αυτό θέλω να μάθω πως να το διορθώνω..... Ο τρόπος που βρήκα χτές ήταν ονομάζοντας το αρχείο από *.c se *.cpp έτσι λέει ο compiler γίνεται πιο "χαλαρός" kai δεν χτυπάει...

Δημοσ.

To προθεμα "__" τίθεται ή όχι αυτόματα και αφανώς στον αντικειμενικό κώδικα,

ανάλογα με το αν είναι C ή C++. Eσύ δεν κάνεις απολύτως τίποτε.

Το extern"C" δείχνει στον compiler οτι κώδικας που θα επεξεργαστεί είναι σε μορφή "C" και επομένως

ο compiler χρησιμοποιεί την κατάλληλη σύμβαση προκειμένου να δει τα αρχεία.

 

Αυτό που κάνεις για να διορθώσεις τις δηλώσεις είναι λάθος.

Αλλάζοντας το *.c σε *.cpp υποδεικνύεις στον compiler ότι ο κώδικας είναι C++ και συνεπώς

για τις δηλώσεις των μεταβλητών (και όλα τα άλλα βεβαίως) ακολουθεί τις συμβάσεις της C++.

Δεν γίνεται πιο χαλαρός ο κώδικας, καμιά σχέση.

 

 

Αυτή την στιγμή δυστυχώς δεν μπορώ να σε βοηθήσω περισσότερο.

Ψάξε τα παραπάνω ή ας σε βοηθήσει κάποιος που είναι διαθέσιμος...

 

-

Δημοσ.

Κάντα όλα C ή C++ και αν τρέχει VS που από ότι βλέπω τρέχει, πήγαινε στα project properties και ρύθμισε των compiler κατάλληλα. Επίσης φρόντισε τυχών βιβλιοθήκες που χρησιμοποιείς να είναι η κατάλληλες (πχ αν γράψεις C time.h, αν γράψεις C++ ctime).

Δημοσ.

Δεν κανεις σωστα linking τα αρχεια σου, πχ αν χρησημοποιεις πανω απο ενα αρχειο πηγαιου κωδικα πρεπει για καθε αρχειο .cpp που δεν εχει main() να κανεις το αντιστοιχο .h που θα εχει τα prototypes των συναρτησεων και θα κανεις #include αυτο κι οχι το .cpp

πχ

main.cpp

>#include "my.h"
int main()
{
   return foo();
}

 

my.h

>#ifndef _MY_H_
#define _MY_H_

int foo();

#endif

 

my.cpp

>#include "my.h"
int foo()
{
   return 12;
}

Δημοσ.

 

Αυτό που με μπερδεύει πιο πολύ από όλα είναι ότι στην main, όταν την έχω se *.c γίνεται χαμός από τα λάθη.

 

 

>  int i,j,nrow, ncol,k;
double TC=0;
FILE*fp=fopen("rsm_data.txt","r");

fscanf(fp,"%d %d",&nrow,&ncol);

int *idxB=(int *)calloc(nrow,sizeof(int));
double **A=callocDouble2d(nrow,ncol);
double *c=(double*)calloc(ncol,sizeof(double));
 

 

 

και ενώ όλα αυτά είναι σωστά μου λέει παρακάτω ότι καμία μεταβλητή μου δεν είναι δηλωμένη. ???????????

 

Σωστά σου λέει ότι δεν έχεις δηλώσει τις μεταβλητές.

Τα παραπάνω δεν είναι δήλωση (declaration) αλλά ορισμός (definition).

Υπάρχει διαφορά στις δυο έννοιες :

ο ορισμός μεταβλητής δεσμεύει χώρο στην μνήμη και μπορεί να την αρχικοποιεί.

η δήλωση δείχνει απλώς ότι κάπου παρακάτω θα χρησιμοποιεθεί η συγκεκριμένη μεταβλητή.

Στην C++ η δήλωση είναι ταυτόχρονα και ορισμός. Στην C, όχι.

Αυτό που κάνεις εδώ (αφού προκειται για C) είναι σα να προσπαθείς

να χρησιμοποιείς τις μεταβλητές δίχως να τις δηλώσεις, γι αυτό "χτυπάει" ο κώδικας.

Σου το είπα ήδη στο post #2 : στην C, πρώτα τα δηλώνεις όλα και μετά τα χρησιμοποιείς.

 

-

Δημοσ.

..

Σου το είπα ήδη στο post #2 : στην C, πρώτα τα δηλώνεις όλα και μετά τα χρησιμοποιείς.

...

 

Αυτό έχει πάψει να ισχύει από την αναθεώρηση C99. Μπορείς και δηλώνεις σε οποιαδήποτε γραμμή θέλεις στο τρέχον μπλοκ. Αλλά η Microsoft έχει παρατημένη την C στην αναθεώρηση C89/C90.

 

@jimblaki:

 

Εφόσον ασχολείσαι μονάχα με C. σκέψου πολύ σοβαρά να εγκαταλείψεις το VS. Δες την Pelles-C (πρόσφατα έβγαλε νέα έκδοση με υποστήριξη της αναθεώρησης C11) ή κάποιο από τα πολλά IDE για τον mingw gcc.

 

Επίσης, δεν είναι καθόλου καλή ιδέα να αναμειγνύεις κώδικα C με C++ χωρίς να ξέρεις απολύτως πως και γιατί το κάνεις.

Δημοσ.

Τον τρελανες τον compiler happy.gif

 

Το προβλημα το εχεις στο linkage. Η λυση ειναι να βαλεις extern "C". Προσοχη, η c δεν εχει αυτο το keyword, για αυτο θα παιξεις με το preprocessor

 

πχ ενα παραδειγμα

*.h

>

#ifdef __cplusplus
extern "C" {
#endif

void test();
void test1();
voidtestN();

#ifdef __cplusplus
}
#endif

 

Δημοσ.

Εφόσον ασχολείσαι μονάχα με C. σκέψου πολύ σοβαρά να εγκαταλείψεις το VS. Δες την Pelles-C (πρόσφατα έβγαλε νέα έκδοση με υποστήριξη της αναθεώρησης C11) ή κάποιο από τα πολλά IDE για τον mingw gcc.

 

Συμφωνώ και επαυξάνω.

 

Κατέβασε Pelles-C που είναι εξαιρετικό και σαν περιβάλλον και σαν compiler και γράφε εκεί ότι θες (απ τη στιγμή πάντα που μιλάμε μονο για C).

 

Είναι κρίμα να χάνεις τόσο χρόνο και να μπουρδουκλώνεις τόσο πολύ τα πράγματα.

... Σημειωτέον την main thn έχω ως main.cpp ...

 

Συμπληρώνω.

 

Το visual studio είναι παρα πολύ καλο γενικά, δε λέω. Και η microsoft c++ δεν έχει αρνητικά σχόλια. Εξαρτάται πάντα τι θες να κανεις.

 

Από κει και πέρα αφού μιλάμε για καθαρή C το visual studio και ο C compiler τις microsoft δεν κάνει*.

 

Αν έχεις προγραμματίσει γενικά σε visual studio μονο είναι πιθανό να σου δημιουργείται μια ανασφάλεια να πας αλλου. Αλλα κανε τον κόπο. Αλλιώς θα χάνεις χρόνο και θα μπουρδουκλώνεις τόσο πολύ τον κώδικα σου.

 

*Διότι βασικά όπως είπε και ο migf1 η microsoft έχει σταματήσει να υποστηρίζει την C (που δίνει για εμπορικούς σκοπούς τουλάχιστον). Γενικά δείχνει να μην την ενδιαφέρει και τόσο η C. Έχει βεβαια τόσες άλλες πλατφόρμες που υποστηρίζει οποτε λογικό.

Δημοσ.

Όπως ήδη είπανε οι συνφορουμίτες, το λάθος είναι το linking.

 

 

Ο linker δεν μπορεί να βρει τις συναρτήσεις που ορίζονται από τα symbols που σου λέει (π.χ. η συνάρτηση callocDouble2d(int,int)) έτσι ώστε να συνδέσει τα κομμάτια κώδικα.

 

 

Δε νομίζω ότι η λύση είναι η χρήση C++ αρχείων ή/και compiler. Εάν ο κώδικας σου είναι C, γράψε C. Χώρια που μερικοί βολικοί τύποι δεν "περνάνε" σε C++ παρά μόνο σε C (ούτε με extern "C" δήλωση για τον compiler).

 

 

Το πρόβλημα που έχεις με το linking, εάν υπάρχει και με την "χρήση" C, εικάζω πως είναι στο πως χειρίζεσαι τα includes σου.

Δημοσ.

συμφωνω με τον Timonkaipumpa, το εχω αντιμετοπισει κι εγω αυτο το προβλημα και το ελυσα με τον τροπο που σου ειπα παραπανω

Δημιουργήστε ένα λογαριασμό ή συνδεθείτε για να σχολιάσετε

Πρέπει να είστε μέλος για να αφήσετε σχόλιο

Δημιουργία λογαριασμού

Εγγραφείτε με νέο λογαριασμό στην κοινότητα μας. Είναι πανεύκολο!

Δημιουργία νέου λογαριασμού

Σύνδεση

Έχετε ήδη λογαριασμό; Συνδεθείτε εδώ.

Συνδεθείτε τώρα
  • Δημιουργία νέου...