Evgenios1 Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Με ποιο τροπο μετατρεπουμε ενα wstring σε unsigned char? Καπου στο κωδικα εκανα το παρακατω. Εχω ενα vector με wstrings και θελω ολο το vector να τον κανω unsigned char array και μετα να το ξανακανω vector με wstrings. >void ShareDirectory::GetBinary(OUT unsigned long *ptr,OUT size_t *sz) { ShareDirectory::buf_siz=0; char tag=0x007; for(int i=0;i<ShareDirectory::Files.size();i++) ShareDirectory::buf_siz+= 1 + (ShareDirectory::GetAt(i).size()* sizeof(_TCHAR)); ShareDirectory::buf_ptr = new unsigned char[shareDirectory::buf_siz]; unsigned long ptr_pos= (unsigned long)ShareDirectory::buf_ptr; for(int i=0;i<ShareDirectory::Files.size();i++) { size_t sz1= ShareDirectory::Files.at(i).size() * sizeof(_TCHAR); memcpy( (void*)ptr_pos, ShareDirectory::Files.at(i).data(), sz1 ); ptr_pos+= sz1; memcpy( (void*)ptr_pos, &tag, 1); ptr_pos+=1; } ptr[0] = (unsigned long)ShareDirectory::buf_ptr; sz[0] = ShareDirectory::buf_siz; } >#include "stdafx.h" #define clearscreen system("CLS");\ printf("\t\t\t\tFile share\n") void menu(void); void server(void); void client(void); int _tmain(int argc, _TCHAR* argv[]) { //menu(); ShareDirectory dir(L"E:\\"); unsigned long ptr; _TCHAR* buf; unsigned int sz=0; dir.GetBinary(&ptr,&sz); char *cbuf=(char*)ptr; wchar_t *wcbuf=(wchar_t*)ptr; int oneStep=0,towStep=0; for(;oneStep<sz;oneStep++) { if(cbuf[oneStep]==0x07) towStep++; if(oneStep%2==0) towStep++; _tprintf(L"%lc",wcbuf[towStep]); } getchar(); return 0; } αλλα πειρε καπου το ματι μου οτι το wchar_t ειναι fixed byte λεει, δηλαδη μπορει να παρει 1 ή και 2 byte (?) και ετσι το παραπανω δεν δουλευει...
Directx Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Αν κατάλαβα καλά θες να πάρεις ένα wchar_t και να το μετατρέψεις ως raw (χύμα) μορφή σε ένα C unsigned char array. Αυτό μπορεί να γίνει με την βοήθεια της memcpy η οποία θα αντιγραψει το Unicode buffer (uniString) στο unsigned char array (Raw -μεγέθους BUFSIZ |define του stdio.h) υπολογίζοντας το μέγεθος του πρώτου επί της βάσης πως το μέγεθος του είναι * sizeof(_TCHAR). Αυτό που θα πάρεις από μια τέτοια μετατροπή είναι όλα τα bytes του Unicode buffer. Από εκεί και πέρα είναι δικό σου θέμα πως θα τα κάνεις transliterate φυσικά (λάβε υπόψη σου το Endian order κτλ). Ακολουθεί κώδικας που μετατρέπει το Unicode String “Hello World现” σε raw bytes μορφή: > //-wchar_t to unsigned char array (c)directx--------------------------------- #include <windows.h> #include <stdio.h> #ifdef __BORLANDC__ #pragma hdrstop #endif #include <tchar.h> //--------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma argsused #endif int _tmain(int argc, _TCHAR* argv[]) { _TCHAR* uniString = L"Hello World现"; unsigned char byRaw[bUFSIZ]; long lLen; // Clean up Raw buffer ZeroMemory(&byRaw, sizeof(byRaw)); // Raw copy of uniString to byRaw memcpy(&byRaw, uniString, (lLen = (lstrlenW(uniString) * sizeof(_TCHAR)))); // Print byRaw on stdout for(int nIdx = 0; nIdx < lLen; nIdx++) printf("[%2.d]%X\n", nIdx, byRaw[nIdx]); // End of program. printf("Press Enter to exit."); getchar(); return 0; } //--------------------------------------------------------------------------- Ο κώδικας έχει γραφθεί σε C++ Builder 2009 (με τον compiler ρυθμισμένο να θεωρεί ότι _TCHAR = wchar_t) και μπορεί να περιέχει bugs ή άλλες αβλεψίες. --- Αν πρόκειται για wstring (τώρα το πρόσεξα ότι ζητάς wstring) απλά βασίζεσαι στην standard STL wstring.copy (κάνεις cast το unsigned char σε wchar_t*) της C++: > //-wstring to unsigned char array (c)directx--------------------------------- #include <cstdio.h> #include <iostream> #ifdef __BORLANDC__ #pragma hdrstop #endif #include <tchar.h> //--------------------------------------------------------------------------- #ifdef __BORLANDC__ #pragma argsused #endif int _tmain(int argc, _TCHAR* argv[]) { std::wstring uniString = L"Hello World现"; unsigned char byRaw[bUFSIZ] = ""; int nCopyLen = uniString.size() * sizeof(wchar_t); // Raw copy of uniString to byRaw uniString.copy((wchar_t*)byRaw, nCopyLen , 0); // Print byRaw on stdout for(int nIdx = 0; nIdx < nCopyLen; nIdx++) std::cout<<"["<<nIdx<<"]"<<std::hex<<(int)byRaw[nIdx]<<std::endl; // End of program. std::cout<<"Press Enter to exit."; std::cin.get(); return 0; } //--------------------------------------------------------------------------- --- Αν απλά θέλεις να μετατρέψεις το Unicode string σε κανονικό ASCII string μπορείς να δοκιμάσεις την Windows API ρουτίνα WideCharToMultiByte η οποία λαμβάνει ένα wchar_t* και το μετατρέπει σε έναν LPSTR array. Η διαδικασία μετατροπής απαιτεί τον ορισμό διαφόρων flags που καθορίζουν το τι θα κάνει η ρουτίνα σε περίπτωση που δεν μπορεί να μετατρέψει κάποιον Unicode χαρακτήρα στον ανάλογο ASCII. Στην περίπτωση μας ζητώ την μετατροπή στο DEFAULT CODEPAGE του συστήματος (CP_ACP) με έλεγχο της μετατροπής (WC_COMPOSITECHECK) και αντικατάσταση κάθε Unicode χαρακτήρα που δεν μπορεί να μετατραπεί σε ASCII με ένα default char (WC_DEFAULTCHAR / cDef). Ο παρακάτω κώδικας ζητά από την WideCharToMultiByte να του δώσει σε πρώτη φάση το μέγεθος του ASCII buffer που χρειάζεται (0 στην παράμετρο cbMultiByte). Ύστερα δεσμεύει το ανάλογο buffer και μετά κάνει την μετατροπή του Unicode string στο ανάλογο ASCII, όποιος χαρακτήρας δεν μπορεί να μετατραπεί στον ανάλογο ASCII αντικαθίσταται με cDef (‘?’): > //-Transliterate Unicode to ASCII directx------------------------------------ #include <windows.h> #include <stdio.h> #include <iostream> #ifdef __BORLANDC__ #pragma hdrstop #endif #ifdef __BORLANDC__ #pragma argsused #endif int _tmain(int argc, _TCHAR* argv[]) { _TCHAR* uniString = L"Hello World现"; char cDef = '?'; int nMultiByteLen; BOOL bChange = TRUE; BYTE *byMultiByte = NULL; BYTE Raw[bUFSIZ]; // Request byMultiByte length (, 0, ). if(!(nMultiByteLen = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK|WC_DEFAULTCHAR, uniString, -1, byMultiByte, 0, &cDef, &bChange))) std::cout<<"WideCharToMultiByte failed with: " << GetLastError(); // Allocate enough memory for byMultiByte to hold the ASCII transliterated uniString.. if((byMultiByte = (BYTE*)new(std::nothrow) BYTE[nMultiByteLen]) != NULL) { // Transliterate uniString to byMultiByte if(!(nMultiByteLen = WideCharToMultiByte(CP_ACP, WC_COMPOSITECHECK|WC_DEFAULTCHAR, uniString, -1, byMultiByte, nMultiByteLen, &cDef, &bChange))) std::cout<<"WideCharToMultiByte failed on conversion with: " << GetLastError(); else // Print results std::cout<<"MultiByte string:\""<<byMultiByte<<"\""<<std::endl; // Free local resources delete[] byMultiByte; } else// Not enough memory!! std::cout<<"Not enough memory!"<<std::endl; // End of program. std::cout<<"\nPress Enter to exit."; std::cin.get(); return 0; } //--------------------------------------------------------------------------- Καλή συνέχεια!
C6WGMN Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Standard C++: > #include <cstdlib> #include <cstring> #include <cwchar> // ... wchar_t *s = L"Hello world"; // Directx διόρθωση size_t len = wcslen(s) * sizeof *s; unsigned char *p = malloc(len); if(p) { memcpy(p, s, len); // ... } free (p);
Directx Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Sorry αλλά Standard C++ αυτό που δίνεις δεν είναι (κανένας που δουλεύει σε C++ δεν θα το έγραφε έτσι), mixture C/C++ ναι.. (βασικά αυτό που διαβάζω είναι σκέτη C |το wchar_t s -> whcar_t *s) – αν θες C++ way δώσε του ένα wstring.copy και τέλος (επίσης προτίμησε τα new και delete)._
Evgenios1 Δημοσ. 19 Σεπτεμβρίου 2009 Μέλος Δημοσ. 19 Σεπτεμβρίου 2009 Εκανα τις αλλαγες μου, >[color="#0000ff"][b]void[/b][/color] ShareDirectory::GetBinary(OUT [color="#8000ff"]unsigned[/color] [color="#8000ff"]long[/color] *ptr,OUT size_t *sz) { ShareDirectory::buf_siz=[color="#ff8000"]0[/color]; [color="#0000ff"][b]for[/b][/color]([color="#8000ff"]int[/color] i=[color="#ff8000"]0[/color];i<ShareDirectory::Files.size();i++) { ShareDirectory::Files.at(i).append(L[color="#a31515"]"$"[/color]); ShareDirectory::buf_siz += (ShareDirectory::GetAt(i).size()* [color="#0000ff"][b]sizeof[/b][/color](_TCHAR)); } ShareDirectory::buf_ptr = [color="#0000ff"][b]new[/b][/color] [color="#8000ff"]unsigned[/color] [color="#8000ff"]char[/color][shareDirectory::buf_siz]; [color="#8000ff"]unsigned[/color] [color="#8000ff"]long[/color] ptr_pos= ([color="#8000ff"]unsigned[/color] [color="#8000ff"]long[/color])ShareDirectory::buf_ptr; [color="#0000ff"][b]for[/b][/color]([color="#8000ff"]int[/color] i=[color="#ff8000"]0[/color];i<ShareDirectory::Files.size();i++) { size_t sz1= ShareDirectory::Files.at(i).size() * [color="#0000ff"][b]sizeof[/b][/color](_TCHAR); ShareDirectory::Files.at(i).copy( ([color="#8000ff"]wchar_t[/color]*)ptr_pos, sz1, [color="#ff8000"]0[/color]); ptr_pos+=sz1; } ptr[[color="#ff8000"]0[/color]] = ([color="#8000ff"]unsigned[/color] [color="#8000ff"]long[/color])ShareDirectory::buf_ptr; sz[[color="#ff8000"]0[/color]] = ShareDirectory::buf_siz; } >nt _tmain([color="#8000ff"]int[/color] argc, _TCHAR* argv[]) { [color="#008000"][i]//menu();[/i][/color] ShareDirectory dir(L[color="#a31515"]"E:\\"[/color]); [color="#8000ff"]unsigned[/color] [color="#8000ff"]long[/color] ptr; [color="#8000ff"]unsigned[/color] [color="#8000ff"]int[/color] sz=[color="#ff8000"]0[/color]; dir.GetBinary(&ptr,&sz); [color="#8000ff"]wchar_t[/color] *wcbuf=([color="#8000ff"]wchar_t[/color]*)ptr; [color="#0000ff"][b]for[/b][/color]([color="#8000ff"]int[/color] i=[color="#ff8000"]0[/color];i<sz;i++) { [color="#0000ff"][b]if[/b][/color](wcbuf[i]==L'$') { printf([color="#a31515"]"\n"[/color]); i++; } _tprintf(L[color="#a31515"]"%lc"[/color],wcbuf[i]); } getchar(); [color="#0000ff"][b]return[/b][/color] [color="#ff8000"]0[/color]; } [color="#0000ff"][b]void[/b][/color] menu([color="#0000ff"][b]void[/b][/color]) και το output dottypes.exenet test.swf testv.swf WindowsService.exe InstallUtil.InstallLog WindowsService.InstallLog WindowsService.InstallState cdb.sdf DmpExe.exe shell.exe testfold New Text asdaasdasdsdasdre man.txt test.txt en2gr 1.exe ?????? ▲@?Ό?6?6?????????????????????????????????????????????????????????????? ??????????????????????????????????????????????????♀▲?∟?6?6 ☺ ψ ??test.swf ?????????????? ♀♀?∟?6?6 ☺ τ ??dottypes.exe ?????????? Ειναι σωστα τα αρχεια, αλλα τι στο καλο ειναι αυτο? ?????? ▲@?Ό?6?6????????????????????????????????????????????????????????????????????????????????????????????????????????????????♀▲?∟?6?6 ☺ ψ ??test.swf ?????????????? ♀♀?∟?6?6 ☺ τ ??dottypes.exe ??????????
C6WGMN Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Sorry αλλά Standard C++ αυτό που δίνεις δεν είναι (κανένας που δουλεύει σε C++ δεν θα το έγραφε έτσι), mixture C/C++ ναι.. (βασικά αυτό που διαβάζω είναι σκέτη C |το wchar_t s -> whcar_t *s) – αν θες C++ way δώσε του ένα wstring.copy και τέλος (επίσης προτίμησε τα new και delete)._ Δεν υπάρχει compiler που δεν θα το δεχτεί αυτό, φανταστικός compiler η αληθινός. Οποτε είναι standard C++. Δεν αρνούμαι ότι αυτή η λύση είναι C στην πραγματικότητα, όλα τα headers αρχίζουν με c (οποτε είναι C header) αλλα δεν παύει να είναι και C++. Ο λόγος που έκανα έτσι το post είναι επειδή δεν γνωρίζω καθόλου C++. Η δικια σου λύση είναι λύση σε windows περιβάλλον (φαίνεται από το winapi, TCHAR και λοιπά). Ο Evgenios1 από ότι φαίνεται για windows ενδιαφέρεται μονο. Εγώ παραχώρησα την δικια μου λύση απλά για να υπάρχει και αυτή. @Evgenios1 Ευγένιε το πρόβλημα είναι ότι ο sz κρατάει την τιμή πολλαπλασιασμένη με sizeof (_TCHAR), όμως ο πολλαπλασιασμός είναι λάθος όταν χρησιμοποιείς το _TCHAR pointer. Δοκίμασε >for(int i=0;i<sz / sizeof (_TCHAR);i++)
Evgenios1 Δημοσ. 19 Σεπτεμβρίου 2009 Μέλος Δημοσ. 19 Σεπτεμβρίου 2009 @Evgenios1 Ευγένιε το πρόβλημα είναι ότι ο sz κρατάει την τιμή πολλαπλασιασμένη με sizeof (_TCHAR), όμως ο πολλαπλασιασμός είναι λάθος όταν χρησιμοποιείς το _TCHAR pointer. Δοκίμασε >for(int i=0;i<sz / sizeof (_TCHAR);i++) Ελεος! μπροστα στα ματια μου,
Directx Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Δεν υπάρχει compiler που δεν θα το δεχτεί αυτό, φανταστικός compiler η αληθινός. Οποτε είναι standard C++. Δεν αρνούμαι ότι αυτή η λύση είναι C στην πραγματικότητα, όλα τα headers αρχίζουν με c (οποτε είναι C header) αλλα δεν παύει να είναι και C++. Με την ευρεία έννοια του όρου όπως καταλαβαίνεις κάθε κώδικας γραμμένος σε C μπορεί να γίνει compile από έναν C++ compiler όμως αυτό προσωπικά δεν θεωρώ ότι νομιμοποιεί την αναγόρευση τέτοιου κώδικα σε Standard C++. Μπορείς να το πεις legacy C, μπορείς αν χρησιμοποιείς κάποιες ιδιότητες της C++ μέσα του να τον πεις C/C++ αλλά οπωσδήποτε να τον αναγορεύεις σε Standard C++ είναι ατόπημα, αν κάποιος σου ζητούσε C++ λύση και παρουσίαζες αυτό .. θα υπήρχε πρόβλημα. Για εμένα αυτό που έγραψες είναι μια όμορφη λύση σε γλώσσα C (δεν χρησιμοποιείς κανένα ιδίωμα ή δυνατότητα της C++ για να το πεις διαφορετικά) και καλά έκανες και την ανάρτησες. Στο λέω φιλικά και είναι πάντα η προσωπική μου άποψη οπότε δεν έχω κάτι περισσότερο να προσθέσω επί του θέματος
C6WGMN Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Με την ευρεία έννοια του όρου όπως καταλαβαίνεις κάθε κώδικας γραμμένος σε C μπορεί να γίνει compile από έναν C++ compiler όμως αυτό προσωπικά δεν θεωρώ ότι νομιμοποιεί την αναγόρευση τέτοιου κώδικα σε Standard C++. Μπορείς να το πεις legacy C, μπορείς αν χρησιμοποιείς κάποιες ιδιότητες της C++ μέσα του να τον πεις C/C++ αλλά οπωσδήποτε να τον αναγορεύεις σε Standard C++ είναι ατόπημα, αν κάποιος σου ζητούσε C++ λύση και παρουσίαζες αυτό .. θα υπήρχε πρόβλημα. Για εμένα αυτό που έγραψες είναι μια όμορφη λύση σε γλώσσα C (δεν χρησιμοποιείς κανένα ιδίωμα ή δυνατότητα της C++ για να το πεις διαφορετικά) και καλά έκανες και την ανάρτησες. Στο λέω φιλικά και είναι πάντα η προσωπική μου άποψη οπότε δεν έχω κάτι περισσότερο να προσθέσω επί του θέματος Για να τα μαζέψουμε λίγο αυτά στα οποια διαφωνούμε: Εγώ είπα ότι ο κώδικας είναι standard C++ και εσύ διαφωνείς, επίσης υποστηρίζεις ότι είναι C. Σου εξήγησα και πιο πριν ότι εγώ καταλαβαίνω τι εννοείς, όμως δεν άλλαξα γνώμη για τον κώδικα. Όντως λοιπόν είναι C++ αλλα καταντάμε να διαφωνούμε για semantics, που οι πιο πολλοί δεν τους ενδιαφέρουν, αφού περισσότερο μοιάζουν με τον ΚΟΚ παρα προγραμματισμό. Το επιχείρημα σου είναι ότι ο κώδικας είναι C επειδή χρησιμοποιεί μονο συναρτήσεις και ιδιώματα αυτής της γλώσσας. Εγώ σε ρωτάω με την ίδια λογική αν μπορείς εσύ να μου δείξεις κάτι στον κώδικα που να μην είναι C++ (ώστε και το συμπέρασμα σου, ότι δεν είναι C++, να είναι αληθές). Όπως γνωρίζεις (αλλα αναφέρω και για τους υπολοιπους), η λεγομενη "Standard C++" προσδιορίζεται από ένα αρχείο με το όνομα ISO/IEC 14882:2003. Παρακάτω έχω το κεφαλαιο που αναφέρει τα σχετικά, 17.4.1.2 Headers πινακας 12. Αλλα για να έρθω και στα λόγια σου, ίσως ο κώδικας σου να μην είναι δεχτός σε αίτηση εργασίας, διότι δεν εκμεταλλεύεται τις δυνατότητες τις C++ όπως θα έπρεπε.
Directx Δημοσ. 19 Σεπτεμβρίου 2009 Δημοσ. 19 Σεπτεμβρίου 2009 Για να τα μαζέψουμε λίγο αυτά στα οποια διαφωνούμε: Εγώ είπα ότι ο κώδικας είναι standard C++ και εσύ διαφωνείς, επίσης υποστηρίζεις ότι είναι C. Σου εξήγησα και πιο πριν ότι εγώ καταλαβαίνω τι εννοείς, όμως δεν άλλαξα γνώμη για τον κώδικα. Όντως λοιπόν είναι C++ αλλα καταντάμε να διαφωνούμε για semantics, που οι πιο πολλοί δεν τους ενδιαφέρουν, αφού περισσότερο μοιάζουν με τον ΚΟΚ παρα προγραμματισμό. Το επιχείρημα σου είναι ότι ο κώδικας είναι C επειδή χρησιμοποιεί μονο συναρτήσεις και ιδιώματα αυτής της γλώσσας. Εγώ σε ρωτάω με την ίδια λογική αν μπορείς εσύ να μου δείξεις κάτι στον κώδικα που να μην είναι C++ (ώστε και το συμπέρασμα σου, ότι δεν είναι C++, να είναι αληθές). Όπως γνωρίζεις (αλλα αναφέρω και για τους υπολοιπους), η λεγομενη "Standard C++" προσδιορίζεται από ένα αρχείο με το όνομα ISO/IEC 14882:2003. Παρακάτω έχω το κεφαλαιο που αναφέρει τα σχετικά, 17.4.1.2 Headers πινακας 12. Αλλα για να έρθω και στα λόγια σου, ίσως ο κώδικας σου να μην είναι δεχτός σε αίτηση εργασίας, διότι δεν εκμεταλλεύεται τις δυνατότητες τις C++ όπως θα έπρεπε. Κοίταξε έχεις καταλάβει νομίζω, απόλυτα τι λέω και ξέρεις ότι έχω δίκιο (το μαρτυρά η αντίδραση σου με τα πρότυπα κτλ. κτλ. κτλ.). Η C++ δεν είναι αυθύπαρκτη γλώσσα προφανώς και μπορεί να μεταφράσει και να υποστηρίξει την απλή C, το θέμα λοιπόν δεν είναι απλά ο τύπος αλλά προπάντων η ουσία, και η ουσία (ή αν θες καλύτερα η φιλοσοφία) είναι ότι όταν μιλάμε για C++ καλό είναι να γράφουμε και να εκμεταλλευόμαστε τις δυνατότητες που μας προσφέρει ανεξαρτήτως αν μπορούμε να κάνουμε το ίδιο (πιο βρώμικα) γράφοντας σε καθαρή C, διαφορετικά ποίος ο λόγος να ασχολούμαστε με C++ (ειλικρινά, ποίο το νόημα να λέμε για C++ αν δεν χρησιμοποιούμε "κάτι" από αυτά τα ρημάδια τα ++ που ακολουθούν το C ρε παιδί μου; ). Τώρα από εκεί και πέρα να αναγορεύουμε λοιπόν, κώδικα C που μπορεί να γίνει compile στην C++ ως κώδικα C++ απλά γιατί το πρότυπο παρέχει support για C κώδικα (φυσικό C++ λέγεται) διότι απλά μένουμε στον τύπο και χάνουμε την ουσία της C++ διότι κάποιος Directx μας είπε "sorry φίλε δεν είναι έτσι[..]" και εμείς θέλουμε να του αποδείξουμε ότι είναι έτσι, ε, φίλε λυπάμαι αλλά .. τέλος πάντων, απόψεις, καλή συνέχεια -ο καθένας κρίνεται από τα λεγόμενα του. Υ.Γ. 1. Όσον αφορά τον κώδικα μου σε C++ (λες «σου» στο μήνυμα σου οπότε το παίρνω ως μπικτή -εκτός αν εννοείς "μου" οπότε συγγνώμη παρεξήγηση από την διατύπωση), αν εννοείς ότι δεν είναι καλός (μπορεί να μην πράγματι..), παρουσίασε μου εσύ κάτι καλύτερο σε C++. 2. Το χειρότερο πρόβλημα των C programmers ακόμα και των gurus όταν πιάνουν την C++ είναι να τους πείσεις ότι είναι novices και θα πρέπει να μάθουν πολλά καινούργια πράματα για να μην γράφουν C(++) –γνωστό θέμα.
bokarinho Δημοσ. 20 Σεπτεμβρίου 2009 Δημοσ. 20 Σεπτεμβρίου 2009 Κοίταξε έχεις καταλάβει νομίζω, απόλυτα τι λέω και ξέρεις ότι έχω δίκιο (το μαρτυρά η αντίδραση σου με τα πρότυπα κτλ. κτλ. κτλ.). Η C++ δεν είναι αυθύπαρκτη γλώσσα προφανώς και μπορεί να μεταφράσει και να υποστηρίξει την απλή C, το θέμα λοιπόν δεν είναι απλά ο τύπος αλλά προπάντων η ουσία, και η ουσία (ή αν θες καλύτερα η φιλοσοφία) είναι ότι όταν μιλάμε για C++ καλό είναι να γράφουμε και να εκμεταλλευόμαστε τις δυνατότητες που μας προσφέρει ανεξαρτήτως αν μπορούμε να κάνουμε το ίδιο (πιο βρώμικα) γράφοντας σε καθαρή C, διαφορετικά ποίος ο λόγος να ασχολούμαστε με C++ (ειλικρινά, ποίο το νόημα να λέμε για C++ αν δεν χρησιμοποιούμε "κάτι" από αυτά τα ρημάδια τα ++ που ακολουθούν το C ρε παιδί μου; ). Τώρα από εκεί και πέρα να αναγορεύουμε λοιπόν, κώδικα C που μπορεί να γίνει compile στην C++ ως κώδικα C++ απλά γιατί το πρότυπο παρέχει support για C κώδικα (φυσικό C++ λέγεται) διότι απλά μένουμε στον τύπο και χάνουμε την ουσία της C++ διότι κάποιος Directx μας είπε "sorry φίλε δεν είναι έτσι[..]" και εμείς θέλουμε να του αποδείξουμε ότι είναι έτσι, ε, φίλε λυπάμαι αλλά .. τέλος πάντων, απόψεις, καλή συνέχεια -ο καθένας κρίνεται από τα λεγόμενα του. Υ.Γ. 1. Όσον αφορά τον κώδικα μου σε C++ (λες «σου» στο μήνυμα σου οπότε το παίρνω ως μπικτή -εκτός αν εννοείς "μου" οπότε συγγνώμη παρεξήγηση από την διατύπωση), αν εννοείς ότι δεν είναι καλός (μπορεί να μην πράγματι..), παρουσίασε μου εσύ κάτι καλύτερο σε C++. 2. Το χειρότερο πρόβλημα των C programmers ακόμα και των gurus όταν πιάνουν την C++ είναι να τους πείσεις ότι είναι novices και θα πρέπει να μάθουν πολλά καινούργια πράματα για να μην γράφουν C(++) –γνωστό θέμα. Και στο φιναλέ φίλε μου C6WGMN αυτά τα malloc - free τι τα θέλεις και τα χρησιμοποιείς όταν θέλεις να γράψεις C++ όταν η ίδια η γλώσσα προτείνει από γεννησιμιού της τα new - delete[]. 'Αλλωστε η C++ με τα new και delete σου δίνει μία ασφαλέστερη malloc καθώς η new είναι και type safe και έχει και περισσότερες δυνατότητες από την C malloc. Βέβαια δεν διαφωνώ ότι και η new και η delete μέσα τους κρύβουν μία malloc - free, αλλά οι δεύτερες δεν είναι C++ είναι C, δεν φτιάχτηκαν να λειτουργούν με αντικείμενα, με constructors, destructors etc. Δεν ξέρω αν με καταλαβαίνεις αλλά συμφωνώ με τον DirectX στο ότι ο κώδικας σου δεν ειναι C++ όπως πιστεύω εγώ αλλά νιώθω ότι "βαφτίζεις" σε C++ εκμεταλλευόμενος το γεγονός ότι η C είναι σαν υποσύνολο της C++. Άλλωστε έφτιαξαν την C++ as a better C.
Evgenios1 Δημοσ. 20 Σεπτεμβρίου 2009 Μέλος Δημοσ. 20 Σεπτεμβρίου 2009 Μην λεμε οτι θελουμε.... εκανα μια ερωτηση για c++ και wstring. Και εσεις το πηγατε στο "εγω την εχω πιο μεγαλη κλπ..." και η c++ ειναι υποσυνολο της c και δωσε και παρε και και και και.....
Directx Δημοσ. 20 Σεπτεμβρίου 2009 Δημοσ. 20 Σεπτεμβρίου 2009 @bokarinho: Φίλε μου σε ευχαριστώ πολύ! @Evgenios1: Μην είσαι αχάριστος.. ζήτησες την βοήθεια μας.. την έλαβες.. έκανες την δουλεία σου, όλα καλά. Ύστερα αναπτύχθηκε μια διένεξη σχετικά με το τι είναι «μια μορφή κώδικα» που δημοσιεύθηκε. Η διένεξη κινήθηκε σε κόσμιο επίπεδο και έληξε, οπότε πες σε όλους μας ένα «ευχαριστώ ρε παιδιά» (και ας μην το εννοείς) που ασχοληθήκαμε με το ερώτημα σου και τέλος Ειλικρινά μην με κάνεις να μετανιώσω που ασχολήθηκα με το θέμα.
3c0r1z Δημοσ. 20 Σεπτεμβρίου 2009 Δημοσ. 20 Σεπτεμβρίου 2009 Τελικά βρέθηκε λύση στο πρόβλημα; Και αν ναι τότε πια είναι; Επίσης να συμφωνήσω με τον bokarinho, οι free/malloc σε συνδυασμό με αντικείμενα μόνο προβλήματα δημιουργούν, διότι απλά η free μπορεί μεν να αποδεσμεύει την μνήμη που είχε δεσμεύσει η malloc αλλά δεν καλεί τον destructor. Και αυτό συνεπάγεται memory leak. Θα ήθελα επίσης να πω αφού μας αρέσει τόσο πολύ η C++() καλό θα είναι να χρησιμοποιούμε smart pointer για να είμαστε όλοι ευχαριστημένοι.
Evgenios1 Δημοσ. 20 Σεπτεμβρίου 2009 Μέλος Δημοσ. 20 Σεπτεμβρίου 2009 @bokarinho: Η διένεξη κινήθηκε σε κόσμιο επίπεδο και έληξε, οπότε πες σε όλους μας ένα «ευχαριστώ ρε παιδιά» (και ας μην το εννοείς) που ασχοληθήκαμε με το ερώτημα σου και τέλος Εχεις δικαιο, ξεχασα να σου πω ευχαριστω. Σε ευχαριστω* *Το εννοω
Προτεινόμενες αναρτήσεις
Αρχειοθετημένο
Αυτό το θέμα έχει αρχειοθετηθεί και είναι κλειστό για περαιτέρω απαντήσεις.