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

Διαφορά Builder6 - Embarcadero 2010


georginos1989

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

Κανω ενα απλό προγραμματακι με vectors για να τα δοκιμάσω και μια κλαση που περιέχει 2 Strings.. Στην Borland 6 τρεχει μια χαρά ενω στην Embarcadero πεταει Linker error του τυπου

 

[iLINK32 Error] Error: Unresolved external '__fastcall Strhlpr::UnicodeFree(System::UnicodeString&)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|ustring

[iLINK32 Error] Error: Unresolved external '__fastcall Strhlpr::UnicodeFromPChar(System::UnicodeString&, char *)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|ustring

[iLINK32 Error] Error: Unresolved external '__fastcall System::UniqueString(System::AnsiStringT<0>&)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|ustring

[iLINK32 Error] Error: Unresolved external '__fastcall Strhlpr::UnicodeFromAnsi(System::UnicodeString&, System::AnsiStringT<65535>&)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|ustring

[iLINK32 Error] Error: Unresolved external '__fastcall Strhlpr::UnicodeAssign(System::UnicodeString&, System::UnicodeString&)' referenced from C:\PROGRAM FILES\EMBARCADERO\RAD STUDIO\7.0\LIB\DEBUG\VCLE.LIB|ustring

 

Το προγραμμα ειναι το παρακατω

 

#include<stdio.h>

#include<conio.h>

#include "Unit1.h"

#include<string.h>

#include <algorithm>

#include <numeric>

#include<vcl.h>

#include<iostream.h>

#include<vector.h>

//using namespace std;

main() {

 

User u1("Geiorgos","11"),u2("Giannis","53");

vector<User> user;

 

user.push_back(u1);

user.push_back(u2);

 

printf("%s %s", user[0]);

printf("%s %s", user[1]);

 

 

getch();

}

 

Η κλαση User περιεχει 2 stirngs Μονο contructos kai set/get

 

Τι παίζει?

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Θα πρέπει να ελέγξεις αν η class που χρησιμοποιείς καλεί οποιαδήποτε ρουτίνα της VCL (πχ. AnsiString -ο κώδικας του User class μου είναι άγνωστος) και αν ναι τότε θα πρέπει να δημιουργήσεις ένα νέο "Console project" με μαρκαρισμένη την επιλογή Use VCL στο "New Console Application" wizard. Συνήθως αυτό βοηθά στην επίλυση τέτοιων προβλημάτων.

 

Αυτά σε C++ Builder 2009

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

#ifndef Unit1H

#define Unit1H

#include<String.h>

#include<vcl.h>

 

//---------------------------------------------------------------------------

 

class User {

private:

String s1;

String s2;

public:

User() {};

User(String s1_, String s2_) {

s1=s1_;

s2=s2_;

}

void setS1(String s1_) {

s1=s1_;

}

void setS2(String s2_) {

s1=s2_;

}

String getS1() {

return s1;

}

String getS2() {

return s2;

}

};

 

#endif

 

Να και ο κωδικας της User. Εγώ πάντα ξετικαρω το vcl και αν χρειαστει το κανω include οπως και εδω..

Θα δοκιμασω και αυτο που λες

 

Αν και νομιζω ειναι το ιδιο....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Απο που να αφαιρεσω το Include? απο τη main?

Από αυτό:

>
#ifndef Unit1H
#define Unit1H
#include<String.h>
#include<vcl.h> // Αυτό εκτός!

//---------------------------------------------------------------------------

class User {
private:
String s1;
String s2;
public:
User() {};
User(String s1_, String s2_) {
s1=s1_;
s2=s2_;
}
void setS1(String s1_) {
s1=s1_;
}
void setS2(String s2_) {
s1=s2_;
}
String getS1() {
return s1;
}
String getS2() {
return s2;
}
};

#endif

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Λοιπόν, καταρχήν αφαίρεσε όλα τα VCL.H #include σου και ύστερα αντικατέστησε το String σε string διότι το String αντιστοιχεί σε AnsiString (στον C++ Builder 6 -στον 2009 νομίζω θεωρείται UnicodeString) και φυσικά δίχως VCL δεν πρόκειται να περάσει στο linking. Η χρήση του String στην VCL είναι πλέον deprecated πρακτική διότι οδηγούσε σε τέτοιου είδους μπερδέματα (σήμερα αν θέλουμε VCL Strings τα ορίζουμε ως UnicodeString ή AnsiString και όχι ως String).

 

Ακολουθεί ο κώδικας σου μεταγραμμένος ώστε να τρέχει σε C++ Builder 2009, δίχως χρήση VCL αλλά C++ STL string:

 

>
#include<stdio.h>
#include<conio.h>
#include<string.h>
#include <algorithm>
#include <numeric>
#include<iostream.h>
#include<vector.h>

using namespace std;

class User {
private:
	string s1;
	string s2;
public:
	User() {};
	User(string s1_, string s2_) {
	s1=s1_;
	s2=s2_;
}
void setS1(string s1_) {
	s1=s1_;
}
void setS2(string s2_) {
	s1=s2_;
}
string getS1() {
	return s1;
}
string getS2() {
	return s2;
}
};

main() {

User u1("Geiorgos","11"),u2("Giannis","53");
vector<User> user;

user.push_back(u1);
user.push_back(u2);

printf("%s\n", user[0].getS1().c_str());
printf("%s\n", user[1].getS2().c_str());

getch();
}

 

ΕΞΟΔΟΣ:

>
Geiorgos
53

Καλή συνέχεια!

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

ναι και σαυτην την εκδοση unicodestring νομιζω είναι

Λοιπόν έκανα console application χωρις την vcl εγραψα την main Και σε άλλο Unit την κλασση χωρις τα includes της vcl

Αλλά βγάζει αυτά τα σφάλματα

 

[bCC32 Error] Unit2.h(10): E2303 Type name expected

Full parser context

Unit2.cpp(5): #include Unit2.h

Unit2.h(8): class User

[bCC32 Error] Unit2.h(10): E2139 Declaration missing ;

Full parser context

Unit2.cpp(5): #include Unit2.h

Unit2.h(8): class User

[bCC32 Error] Unit2.h(11): E2303 Type name expected

Full parser context

Unit2.cpp(5): #include Unit2.h

Unit2.h(8): class User

[bCC32 Error] Unit2.h(11): E2238 Multiple declaration for 'User::string'

Full parser context

Unit2.cpp(5): #include Unit2.h

Unit2.h(8): class User

[bCC32 Error] Unit2.h(10): E2344 Earlier declaration of 'User::string'

Full parser context

Unit2.cpp(5): #include Unit2.h

Unit2.h(8): class User

[bCC32 Error] Unit2.h(11): E2139 Declaration missing ;

Full parser context

Unit2.cpp(5): #include Unit2.h

Unit2.h(8): class User

[bCC32 Error] Unit2.h(14): E2293 ) expected

Full parser context

Unit2.cpp(5): #include Unit2.h

Unit2.h(8): class User

[bCC32 Error] Unit2.h(30): E2040 Declaration terminated incorrectly

Full parser context

Unit2.cpp(5): #include Unit2.h

[bCC32 Error] Unit2.h(30): E2190 Unexpected }

Full parser context

Unit2.cpp(5): #include Unit2.h

 

Τα οποια τα περισσότερα χτυπάνε στα private μελος της κλάσης οπου δηλώνω ta strings

 

Τι βλακεία είναι αυτη....

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Τα σφάλματα αυτά οφείλονται σε λάθος δηλώσεις στο Header σου κτλ.

Σου επισυνάπτω ένα zip με τα αρχεία του προγράμματος οργανωμένα έτσι ώστε να γίνονται compile σε C++ Builder 2009.

classes.zip

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Ρίξε μια ματιά εδώ καθώς μαζί με την εξήγηση ακολουθούν και παραδείγματα.

Σε γενικές γραμμές το std είναι η στάνταρτ ονομασία του namespace της STL και υποδεικνύει στον compiler ότι εσύ θέλεις να χρησιμοποιήσεις κάποια class που ανήκει σε αυτό (πχ. std::string -> από όλες τις string class που μπορεί να υπάρχουν, εγώ θέλω την class string της STL). Πέραν του std:: μπορείς να πεις γενικά στον compiler ότι θέλεις να χρησιμοποιεί τις classes της STL οπουδήποτε γράφοντας "using namespace std;" αλλά στα header αρχεία προτιμώ να δηλώνω ξεχωριστά κάθε namespace προς αποφυγή πιθανών conflicts που μπορεί να προκύψουν.

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Γιατί χτυπάει στο παρακάτω προγραμμα στον contructor?

 

[iLINK32 Error] Error: Unresolved external 'Student::Student()' referenced from C:\DOCUMENTS AND SETTINGS\GIORGOS\ΤΑ ΈΓΓΡΑΦΆ ΜΟΥ\RAD STUDIO\PROJECTS\TESTVECTOR\DEBUG\MAIN.OBJ

 

main

 

string name;

int aem,grade;

vector<Student> s;

vector<Grade> g;

for(int i=0;i<10;i++)

{

cout<<"Give name"<<endl;

cin>>name ;

cout<<"Give aem"<<endl;

cin>>aem;

Student stud(name,aem);

s.push_back(stud);

cout<<"Give grade"<<endl;

cin>>grade ;

g.push_back(Grade(grade,stud));

 

class Grade{

private:

int grade;

Student s;

public:

Grade();

Grade(int grade_, Student s_)

{

grade=grade_ ;

s=s_;

}

void setgrade(int grade_)

{

grade=grade_;

}

int getGrade()

{

return grade;

}

};

 

class Student {

private:

std::string name;

int aem;

public:

Student();

Student(std::string name_,int aem_){

name=name_;

aem=aem_;

}

void setname(std::string name_){

name=name_;

}

void setaem(int aem_){

aem=aem_;

}

int getaem(){

return aem;

}

std::string getname(){

return name;

}

 

 

};

Συνδέστε για να σχολιάσετε
Κοινοποίηση σε άλλες σελίδες

Αρχειοθετημένο

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

  • Δημιουργία νέου...