La Place des Développeurs MSXgl MSX Game Library
aoineko
Membre non connecté
Conseiller Municipal
Reprise du message précédent
Salut,Voici une nouvelle version de ma bibliothèque C : MSXgl v0.3.4-alpha
Change log :
○ [Arkos] Ajout des replayers Arkos Tracker entièrement fonctionnels (merci à Targhan) :
- AKG (générique) : Le lecteur classique. Bon équilibre entre vitesse et place.
- AKY (rapide) : Le lecteur le plus rapide (mais la musique est aussi plus grosse).
- AKM (minimaliste) : Le plus petit lecteur (mais plus lent).
- Ajout d'un programme d'exemple pour montrer l'utilisation des replayers Arkos (s_arkos).
○ [BIOS] Ajout de fonctions pour la lecture du clavier (utilisant des variables système).
○ [Input] Ajout d'une mise à jour optionnelle des rangées complètes du clavier et de fonctions de lecture rapide (pour un environnement sans BIOS).
○ [Sample] Divers nettoyages et corrections sur les programmes d'exemple.
○ [BuildTool] :
- Correction du script de compilation (correction des options des segments de mappeur et ajout du support pour le fichier source assembleur en .s).
- Ajout du répertoire des header SDCC au chemin d'inclusion.
○ [Doc] Mise à jour de la documentation du code (voir /engine/doc/html/index.html)
Arkos sample
Wizzl - WIP game
Si vous avez des questions ou besoin d'aide sur MSXgl, je suis disponible ici ou sur Discord.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
Less bug, more fun
Et tes outils ? Tu les finalisent bientôt pour GCC ?
J'ai pas regardé si tu as publié ceux que tu as déjà convertis... ?
Et tes outils ? Tu les finalisent bientôt pour GCC ?
J'ai pas regardé si tu as publié ceux que tu as déjà convertis... ?
aoineko
Membre non connecté
Conseiller Municipal
J'ai été trop ambitieux avec mes outils car j'ai voulu faire le passage à GCC en même temps que je centralisais les traitements communs entre mes outils.
Du coup, je vais d'abord clean mes outils via Visual Studio (avec lequel j'ai mes habitudes) et ensuite je finirai le passage à GCC.
Du coup, je vais d'abord clean mes outils via Visual Studio (avec lequel j'ai mes habitudes) et ensuite je finirai le passage à GCC.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
Il me semble que t'avais converti ton Bin To Hex, tu veux pas le mettre à dispo... J'ai besoin d'une meilleur outils que celui de base...
Je te fais une bise d'avance
Je te fais une bise d'avance
aoineko
Membre non connecté
Conseiller Municipal
Celui que j'ai converti, c'est mon MSXbin qui converti des fichiers binaires en .h ou .asm.
L'équivalent de hex2bin qui fonctionne bien avec les MegaROM, c'est l'outil dont je te parlais sur l'autre topic.
Il s'appel MSXhex et je viens de le commencer.
Ca devrait être rapide à finir.
Je te tiens au courant.
L'équivalent de hex2bin qui fonctionne bien avec les MegaROM, c'est l'outil dont je te parlais sur l'autre topic.
Il s'appel MSXhex et je viens de le commencer.
Ca devrait être rapide à finir.
Je te tiens au courant.
On est toujours ignorant avant de savoir.
aoineko
Membre non connecté
Conseiller Municipal
Et voilà, j'ai déjà qq programmes qui compilent avec GCC (https://github.com/aoineko-fr/MSXgl/tree/main/tools/MSXtk) :
- MSXbin : Converti un fichier binaire en fichier source C ou assembleur.
- MSXzip : Compresseur (RLEp uniquement actuellement ; sera combiné avec MSXbin à termes).
- MSXhex : Converti un fichier ihx (créé par le Linker de SDCC) en fichier binaire. Supporte les ROM mappées via le format des banks de SDCC. C'est une version customisée de hex2bin spécialement conçu pour SDCC et le MSX.
Pour la compilation via GCC, regarde build.bat.
- MSXbin : Converti un fichier binaire en fichier source C ou assembleur.
- MSXzip : Compresseur (RLEp uniquement actuellement ; sera combiné avec MSXbin à termes).
- MSXhex : Converti un fichier ihx (créé par le Linker de SDCC) en fichier binaire. Supporte les ROM mappées via le format des banks de SDCC. C'est une version customisée de hex2bin spécialement conçu pour SDCC et le MSX.
Pour la compilation via GCC, regarde build.bat.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
Merci !
Comprend pas à quoi ça sert Edité par ericb59 Le 30/04/2022 à 08h38
Citation :
MSXhex : Converti un fichier ihx (créé par le Linker de SDCC) en fichier binaire. Supporte les ROM mappées via le format des banks de SDCC. C'est une version customisée de hex2bin spécialement conçu pour SDCC et le MSX
Comprend pas à quoi ça sert Edité par ericb59 Le 30/04/2022 à 08h38
aoineko
Membre non connecté
Conseiller Municipal
Programme d'exemple:
Les étapes pour créer un fichier binaire final (que tu utilises aussi forcement) :
La compilation, qui va générer du code machine "relatif" pour un fichier source donné. A ce moment-là, on ne sait pas encore où le code va être placé au final et on ne connait pas la valeur des symboles externes (l'adresse des variables/fonctions qui sont dans un autre fichier source). Dans l'exemple la valeur des symboles _extVar et _extFunc est inconnue (ils devront être "résolu" plus tard) et _intVar et _intFunc ont des valeurs relatives au fichier. _intVar aura (probablement) une valeur relative de 0000h par rapport à l'adresse RAM locale (dans le segment _DATA) et _intFunc de 0000h par rapport à l'adresse de code locale (segment _CODE).
La linkage, qui va assembler les codes machines de toutes les sources et résoudre la valeur des symboles. Les variables en RAM vont être accumulés dans le segment _DATA (les unes derrières les autres en fonction de leur taille) et idem pour le contenu des fonctions dans le segment _CODE. Si le fichier d'exemple était linké en premier (en vrai, c'est généralement le crt0) et qu'on a définie les adresses de début de segment avec --codeseg 0x4100 --dataseg 0xC000 alors _intVar vaudrait 0xC000 et la variable suivante 0xC002 (vu que _intVar fait 2 bytes).
Avec SDCC, cette étape génère un fichier IHX (Intel HEX) qui contient tout le contenu binaire du programme au format texte (ASCII).
La binarisation, qui va convertir le fichier IHX en fichier binaire final. Jusqu'à présent j'utilisais hex2bin (de Jacques Pelletier) pour se faire. Pour une ROM qui commence en 4000h, tu lui donnes cette adresse et il va généré le fichier binaire que tu peux installer sur une FlashROM ou mettre dans un émulateur.
Récemment, j'ai compris comment gérer les segments de mapper de ROM au niveau du linkage pour que tout soit assemblé d'un coup et que les symboles des segments soient accessibles de n'importe où. Par ex., si tu as un tableau uint8 myTable[] = { 1, 2, 3, 4 }; dans ton 10e segment d'une ROM ASCII-8, et tu vas pouvoir accéder au symbole myTable depuis n'importe quel autre segment. Ce n'évite pas que le programmeur doive gérer manuellement quel segment se trouve dans quel bank du mapper, mais ça évite de devoir connaitre les adresses à l'avance.
Le soucis, c'est que la façon dont SDCC support l'accès aux symboles des segments n'est pas compatible avec hex2bin.
C'est pourquoi j'ai créé MSXhex qui fait un peu la même chose que hex2bin mais qui reconnais le codage des segments de SDCC et qui réarrange le fichier binaire final en fonction.
Voilà, j'espère que c'est plus clair... au moins un peu.
Code C :
main.c ---------------------------------------- external uint16 extVar; // Variable externe uint16 extFunc(); // Prototype de fonction externe uint16 intVar = 0; // Variable interne uint16 intFunc() { return ++intVar; } // Fonction interne void main() { uint16 result = intFunc() + extFunc(); }
Les étapes pour créer un fichier binaire final (que tu utilises aussi forcement) :
La compilation, qui va générer du code machine "relatif" pour un fichier source donné. A ce moment-là, on ne sait pas encore où le code va être placé au final et on ne connait pas la valeur des symboles externes (l'adresse des variables/fonctions qui sont dans un autre fichier source). Dans l'exemple la valeur des symboles _extVar et _extFunc est inconnue (ils devront être "résolu" plus tard) et _intVar et _intFunc ont des valeurs relatives au fichier. _intVar aura (probablement) une valeur relative de 0000h par rapport à l'adresse RAM locale (dans le segment _DATA) et _intFunc de 0000h par rapport à l'adresse de code locale (segment _CODE).
La linkage, qui va assembler les codes machines de toutes les sources et résoudre la valeur des symboles. Les variables en RAM vont être accumulés dans le segment _DATA (les unes derrières les autres en fonction de leur taille) et idem pour le contenu des fonctions dans le segment _CODE. Si le fichier d'exemple était linké en premier (en vrai, c'est généralement le crt0) et qu'on a définie les adresses de début de segment avec --codeseg 0x4100 --dataseg 0xC000 alors _intVar vaudrait 0xC000 et la variable suivante 0xC002 (vu que _intVar fait 2 bytes).
Avec SDCC, cette étape génère un fichier IHX (Intel HEX) qui contient tout le contenu binaire du programme au format texte (ASCII).
La binarisation, qui va convertir le fichier IHX en fichier binaire final. Jusqu'à présent j'utilisais hex2bin (de Jacques Pelletier) pour se faire. Pour une ROM qui commence en 4000h, tu lui donnes cette adresse et il va généré le fichier binaire que tu peux installer sur une FlashROM ou mettre dans un émulateur.
Récemment, j'ai compris comment gérer les segments de mapper de ROM au niveau du linkage pour que tout soit assemblé d'un coup et que les symboles des segments soient accessibles de n'importe où. Par ex., si tu as un tableau uint8 myTable[] = { 1, 2, 3, 4 }; dans ton 10e segment d'une ROM ASCII-8, et tu vas pouvoir accéder au symbole myTable depuis n'importe quel autre segment. Ce n'évite pas que le programmeur doive gérer manuellement quel segment se trouve dans quel bank du mapper, mais ça évite de devoir connaitre les adresses à l'avance.
Le soucis, c'est que la façon dont SDCC support l'accès aux symboles des segments n'est pas compatible avec hex2bin.
C'est pourquoi j'ai créé MSXhex qui fait un peu la même chose que hex2bin mais qui reconnais le codage des segments de SDCC et qui réarrange le fichier binaire final en fonction.
Voilà, j'espère que c'est plus clair... au moins un peu.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
Ha oui j'avais oublié cette étape. OK j'ai compris. Reste à voir dans la pratique comment on fait. Je reviendrais vers toi là dessus plus tard.
En attendant, toujours des problèmes de compilation :
Obligé d'utiliser -std=c++11 sinon encore plus d'erreurs de compilation.
Pour info je tr mets les erreurs si je ne mets pas en c++11
En attendant, toujours des problèmes de compilation :
Obligé d'utiliser -std=c++11 sinon encore plus d'erreurs de compilation.
Code TEXT :
g++ -o MSXbin -Isrc -Wall -std=c++11 MSXbin.cpp
Code TEXT :
In file included from MSXbin.cpp:23: In file included from ./MSXtk.h:14: ./MSXtk_string.h:67:11: error: use of undeclared identifier '_stricmp'; did you mean 'strcmp'? return (_stricmp(str1, str2) == 0); ^~~~~~~~ strcmp /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/string.h:77:6: note: 'strcmp' declared here int strcmp(const char *__s1, const char *__s2); ^ In file included from MSXbin.cpp:23: In file included from ./MSXtk.h:16: ./MSXtk_export.h:197:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, filename.c_str(), "wb") != 0) ^ ./MSXtk_export.h:233:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, filename.c_str(), "wb") != 0) ^ In file included from MSXbin.cpp:23: In file included from ./MSXtk.h:17: ./MSXtk_file.h:35:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file.Interface, file.Filename.c_str(), "rb") != 0) ^ ./MSXtk_file.h:44:7: error: use of undeclared identifier 'fread_s' if (fread_s(file.Data.data(), file.Size, sizeof(u8), file.Size, file.Interface) != file.Size) ^ MSXbin.cpp:314:6: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, g_InputFile.c_str(), "rb") != 0) ^ MSXbin.cpp:323:6: error: use of undeclared identifier 'fread_s' if (fread_s(binData, fileSize, sizeof(u8), fileSize, file) != fileSize) ^ MSXbin.cpp:441:7: error: use of undeclared identifier 'sprintf_s' sprintf_s(strBuf, BUFFER_SIZE, (g_Address == ADDR_HEXA) ? "%08X | %s" : "%6d | %s", offset, strLine); ^ MSXbin.cpp:443:7: error: use of undeclared identifier 'sprintf_s' sprintf_s(strBuf, BUFFER_SIZE, (g_Address == ADDR_HEXA) ? "%08X" : "%6d", offset); ^ MSXbin.cpp:461:6: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, g_OutputFile.c_str(), "wb") != 0) ^ MSXbin.cpp:562:4: error: use of undeclared identifier 'sscanf_s'; did you mean 'sscanf_l'? sscanf_s(argv[i], "%i", &g_StartAddr); ^~~~~~~~ sscanf_l /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/xlocale/_stdio.h:42:6: note: 'sscanf_l' declared here int sscanf_l(const char * __restrict, locale_t __restrict, const char * __restrict, ...) ^ MSXbin.cpp:562:22: error: cannot initialize a parameter of type 'locale_t' (aka '_xlocale *') with an lvalue of type 'const char [3]' sscanf_s(argv[i], "%i", &g_StartAddr); ^~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/xlocale/_stdio.h:42:59: note: passing argument to parameter here int sscanf_l(const char * __restrict, locale_t __restrict, const char * __restrict, ...) ^ 12 errors generated.
Pour info je tr mets les erreurs si je ne mets pas en c++11
Code TEXT :
Edité par
ericb59
Le 30/04/2022 à 13h30
In file included from MSXbin.cpp:23: In file included from ./src/msxtk.h:14: src/MSXtk_string.h:32:8: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions] const auto r = std::vsnprintf(buf, sizeof buf, fmt, args); ^ src/MSXtk_string.h:37:10: warning: generalized initializer lists are a C++11 extension [-Wc++11-extensions] return {}; ^~ src/MSXtk_string.h:37:10: error: non-aggregate type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') cannot be initialized with an initializer list return {}; ^~ src/MSXtk_string.h:42:10: warning: generalized initializer lists are a C++11 extension [-Wc++11-extensions] return { buf, len }; ^~~~~~~~~~~~ src/MSXtk_string.h:42:10: error: non-aggregate type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') cannot be initialized with an initializer list return { buf, len }; ^~~~~~~~~~~~ src/MSXtk_string.h:54:2: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions] auto vbuf = std::unique_ptr<char[]>(new char[len + 1]); ^ src/MSXtk_string.h:59:9: warning: generalized initializer lists are a C++11 extension [-Wc++11-extensions] return { vbuf.get(), len }; ^~~~~~~~~~~~~~~~~~~ src/MSXtk_string.h:59:9: error: non-aggregate type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') cannot be initialized with an initializer list return { vbuf.get(), len }; ^~~~~~~~~~~~~~~~~~~ src/MSXtk_string.h:67:11: error: use of undeclared identifier 'stricmp'; did you mean 'strcmp'? return (stricmp(str1, str2) == 0); ^~~~~~~ strcmp /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/string.h:77:6: note: 'strcmp' declared here int strcmp(const char *__s1, const char *__s2); ^ In file included from MSXbin.cpp:23: In file included from ./src/msxtk.h:16: src/MSXtk_export.h:197:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, filename.c_str(), "wb") != 0) ^ src/MSXtk_export.h:233:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, filename.c_str(), "wb") != 0) ^ In file included from MSXbin.cpp:23: In file included from ./src/msxtk.h:17: src/MSXtk_file.h:22:20: warning: default member initializer for non-static data member is a C++11 extension [-Wc++11-extensions] FILE* Interface = nullptr; ^ src/MSXtk_file.h:23:14: warning: default member initializer for non-static data member is a C++11 extension [-Wc++11-extensions] u32 Size = 0; ^ src/MSXtk_file.h:35:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file.Interface, file.Filename.c_str(), "rb") != 0) ^ src/MSXtk_file.h:44:7: error: use of undeclared identifier 'fread_s' if (fread_s(file.Data.data(), file.Size, sizeof(u8), file.Size, file.Interface) != file.Size) ^ MSXbin.cpp:101:8: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions] const auto r = std::vsnprintf(buf, sizeof buf, fmt, args); ^ MSXbin.cpp:106:10: warning: generalized initializer lists are a C++11 extension [-Wc++11-extensions] return {}; ^~ MSXbin.cpp:106:10: error: non-aggregate type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') cannot be initialized with an initializer list return {}; ^~ MSXbin.cpp:111:10: warning: generalized initializer lists are a C++11 extension [-Wc++11-extensions] return { buf, len }; ^~~~~~~~~~~~ MSXbin.cpp:111:10: error: non-aggregate type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') cannot be initialized with an initializer list return { buf, len }; ^~~~~~~~~~~~ MSXbin.cpp:123:2: warning: 'auto' type specifier is a C++11 extension [-Wc++11-extensions] auto vbuf = std::unique_ptr<char[]>(new char[len + 1]); ^ MSXbin.cpp:128:9: warning: generalized initializer lists are a C++11 extension [-Wc++11-extensions] return { vbuf.get(), len }; ^~~~~~~~~~~~~~~~~~~ MSXbin.cpp:128:9: error: non-aggregate type 'std::string' (aka 'basic_string<char, char_traits<char>, allocator<char> >') cannot be initialized with an initializer list return { vbuf.get(), len }; ^~~~~~~~~~~~~~~~~~~ MSXbin.cpp:314:6: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, g_InputFile.c_str(), "rb") != 0) ^ MSXbin.cpp:323:6: error: use of undeclared identifier 'fread_s' if (fread_s(binData, fileSize, sizeof(u8), fileSize, file) != fileSize) ^ MSXbin.cpp:333:23: error: unexpected type name 'u8': expected expression AddComment(strData, u8"_____________________________________________________________________________"); ^ MSXbin.cpp:334:23: error: unexpected type name 'u8': expected expression AddComment(strData, u8" ▄▄ ▄ ▄ ▄▄▄ ▄▄ ▄ ▄▄ ▄"); ^ MSXbin.cpp:335:23: error: unexpected type name 'u8': expected expression AddComment(strData, u8" ██ ▀ ██▀█ ▀█▄ ▀█▄▀ ██▄ ▄ ██▀▄"); ^ MSXbin.cpp:336:23: error: unexpected type name 'u8': expected expression AddComment(strData, u8" ▀█▄▀ ██ █ ▄▄█▀ ██ █ ██▄▀ ██ ██ █"); ^ MSXbin.cpp:337:23: error: unexpected type name 'u8': expected expression AddComment(strData, u8"_____________________________________________________________________________"); ^ MSXbin.cpp:441:7: error: use of undeclared identifier 'sprintf_s' sprintf_s(strBuf, BUFFER_SIZE, (g_Address == ADDR_HEXA) ? "%08X | %s" : "%6d | %s", offset, strLine); ^ fatal error: too many errors emitted, stopping now [-ferror-limit=] 12 warnings and 20 errors generated.
aoineko
Membre non connecté
Conseiller Municipal
Tu utilises quelle version de GCC ?
J'utilise la version 11.2.0.
Il n'est pas impossible que mon code ne soit compatible avec C++11.
J'ai pas encore regardé en détail les évolutions récentes du langage.
Par contre, ça compile sans soucis avec la version du C par défaut (j'ai pas trouvé c'est quelle version).
Edit : Compile en C++17 pour plus avoir d'erreur.
J'utilise la version 11.2.0.
Il n'est pas impossible que mon code ne soit compatible avec C++11.
J'ai pas encore regardé en détail les évolutions récentes du langage.
Par contre, ça compile sans soucis avec la version du C par défaut (j'ai pas trouvé c'est quelle version).
Edit : Compile en C++17 pour plus avoir d'erreur.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
J'ai la dernière version, ca prend en charge jusqu'à C++20
Si je compile en C++11
Si je compile en C++11
Code TEXT :
Edité par
ericb59
Le 30/04/2022 à 14h13
src/MSXtk_string.h:67:11: error: use of undeclared identifier '_stricmp'; did you mean 'strcmp'? return (_stricmp(str1, str2) == 0); ^~~~~~~~ strcmp /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/string.h:77:6: note: 'strcmp' declared here int strcmp(const char *__s1, const char *__s2); ^ In file included from MSXbin.cpp:23: In file included from ./src/msxtk.h:16: src/MSXtk_export.h:197:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, filename.c_str(), "wb") != 0) ^ src/MSXtk_export.h:233:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, filename.c_str(), "wb") != 0) ^ In file included from MSXbin.cpp:23: In file included from ./src/msxtk.h:17: src/MSXtk_file.h:35:7: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file.Interface, file.Filename.c_str(), "rb") != 0) ^ src/MSXtk_file.h:44:7: error: use of undeclared identifier 'fread_s' if (fread_s(file.Data.data(), file.Size, sizeof(u8), file.Size, file.Interface) != file.Size) ^ MSXbin.cpp:314:6: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, g_InputFile.c_str(), "rb") != 0) ^ MSXbin.cpp:323:6: error: use of undeclared identifier 'fread_s' if (fread_s(binData, fileSize, sizeof(u8), fileSize, file) != fileSize) ^ MSXbin.cpp:441:7: error: use of undeclared identifier 'sprintf_s' sprintf_s(strBuf, BUFFER_SIZE, (g_Address == ADDR_HEXA) ? "%08X | %s" : "%6d | %s", offset, strLine); ^ MSXbin.cpp:443:7: error: use of undeclared identifier 'sprintf_s' sprintf_s(strBuf, BUFFER_SIZE, (g_Address == ADDR_HEXA) ? "%08X" : "%6d", offset); ^ MSXbin.cpp:461:6: error: use of undeclared identifier 'fopen_s' if (fopen_s(&file, g_OutputFile.c_str(), "wb") != 0) ^ MSXbin.cpp:562:4: error: use of undeclared identifier 'sscanf_s'; did you mean 'sscanf_l'? sscanf_s(argv[i], "%i", &g_StartAddr); ^~~~~~~~ sscanf_l /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/xlocale/_stdio.h:42:6: note: 'sscanf_l' declared here int sscanf_l(const char * __restrict, locale_t __restrict, const char * __restrict, ...) ^ MSXbin.cpp:562:22: error: cannot initialize a parameter of type 'locale_t' (aka '_xlocale *') with an lvalue of type 'const char [3]' sscanf_s(argv[i], "%i", &g_StartAddr); ^~~~ /Applications/Xcode.app/Contents/Developer/Platforms/MacOSX.platform/Developer/SDKs/MacOSX.sdk/usr/include/xlocale/_stdio.h:42:59: note: passing argument to parameter here int sscanf_l(const char * __restrict, locale_t __restrict, const char * __restrict, ...)
ericb59
Membre non connecté
Conseiller Municipal
Sans doute un problèmes avec les fonctions *_s qui semblent spécifiques avec Microsoft.
lu sur stack overflow
lu sur stack overflow
Citation :
Many of Microsoft's secure functions are included in Annex K of the C11 standard, but it is not widely supported, so portability is still an issue. There is a need for the improved security in some applications; maybe the support will improve in the future.
aoineko
Membre non connecté
Conseiller Municipal
Ce qui est étrange c'est que je compile et je link avec la lib GCC... ça voudrait dire que la version Windows de GCC contient ces fonctions, mais pas les autres ?
Faudrait que j'installe une version de Linux pour pouvoir tester.
Édit : C'est pas le sujet ici, mais les versions sécurisées des fonctions de manipulation de chaîne de caractères devrait être dans la norme amha.
Faudrait que j'installe une version de Linux pour pouvoir tester.
Édit : C'est pas le sujet ici, mais les versions sécurisées des fonctions de manipulation de chaîne de caractères devrait être dans la norme amha.
On est toujours ignorant avant de savoir.
ericb59
Membre non connecté
Conseiller Municipal
Oui, alors je viens de faire un test sur Win 11 , en installant MingW, et ca compile parfaitement avec -std=c++17
Et je viens de lire plusieurs post concernant les functions *_s, elles sont optionnelles et pas intégrées dans sur Linux et MacOS.
la solution étant d'ajouter un #define pour la contourner
Après faut aussi faire la même chose avec fread_s ; fwrite_s ; sprintf_s, sscanf_s ...
Tu connais ces fonctions, sans doute tu peux écrire les defines qui vont bien pour les court circuiter ?
Et je viens de lire plusieurs post concernant les functions *_s, elles sont optionnelles et pas intégrées dans sur Linux et MacOS.
la solution étant d'ajouter un #define pour la contourner
Code TEXT :
#ifdef __APPLE__ #define fopen_s(pFile,filename,mode) ((*(pFile))=fopen((filename), (mode)))==NULL #endif
Après faut aussi faire la même chose avec fread_s ; fwrite_s ; sprintf_s, sscanf_s ...
Tu connais ces fonctions, sans doute tu peux écrire les defines qui vont bien pour les court circuiter ?
aoineko
Membre non connecté
Conseiller Municipal
Oui, c'est possible. Par contre j'aimerai ne pas faire ça à l'aveugle donc je vais d'abord tâcher de pouvoir tester sur Linux (ou via un émulateur).
On est toujours ignorant avant de savoir.
Répondre
Vous n'êtes pas autorisé à écrire dans cette catégorie