Publié : mer. 01/août/2007 23:06
Minute! Pas en core fini!
Forums PureBasic - Français
https://www.purebasic.fr/french/
Code : Tout sélectionner
Procedure.S Labels(Fichier.S, CompilerPath.S)
ManagingPath.S = GetTemporaryDirectory()
CompilerPath = RTrim(CompilerPath)
If Right(CompilerPath, 1) <> "\"
CompilerPath + "\"
EndIf
Sortie.S = ""
If FileSize(ManagingPath + "PureBasic.ASM") <> -1
DeleteFile(ManagingPath + "PureBasic.ASM")
EndIf
If RunProgram(CompilerPath + "PBCompiler.EXE", Fichier.S + " /COMMENTED", ManagingPath, #PB_Program_Wait)
Source.L = OpenFile(-1, ManagingPath + "PureBasic.ASM")
Repeat
LineCode.S = ReadString(Source)
LLine = Len(LineCode)
If Left(LineCode, 2) = "l_"
Sortie + Right(LineCode, LLine - 2)
EndIf
Until Eof(Source)
CloseFile(Source)
If DeleteFile(ManagingPath + "PureBasic.ASM") = 0
MessageRequester("Erreur", "Ne peut supprimer le fichier temporaire!")
EndIf
EndIf
ProcedureReturn Sortie
EndProcedure
Et je comprend pas bien le resultat :On a le tableau suivant :
0= Aie
1= Aioli
2= Fines herbes
3=
n° de la dernière chaîne créée : 2 (Fines herbes)
On défonce Fines herbes avec KillString() pas avec Tartare(x) = ""
n° de la dernière chaîne créée : 1 (Aioli)
n° de la prochaine chaine NUL : 0 (Aie)
ça t'étonne que je comprenne pas, hein, ça t'étonnen° de la prochaine chaine NUL : 0 (Aie)
Code : Tout sélectionner
Procedure.L NextNullString(*Index) ;(Ollivier spéciale dédicace à Kcc)
! xor eax, eax ; eax = 0
! mov edi, dword [p.p_Index] ; edi = pointeur index
! mov ebx, edi ; ebx = pointeur index
! mov ecx, 0xFFFFFFFF ; ecx = 4Go
! cld ; cld = recherche de bas en haut
! REPNE SCASD ; >>> Une seule instruction ASM pour For: If PeekL() = 0: ExitFor: EndIf: Next
! mov eax, edi ; eax = adresse trouvée
! sub eax, ebx ; eax = adresse trouvé - adresse tableau
! shr eax, 2 ; eax / 4
! sub eax, 3 ; eax - 3
ProcedureReturn
EndProcedure
Code : Tout sélectionner
Declare.L LastString(*Index)
Declare KillString(Tmp.S(1), n.L)
Dim Tartare.S(70)
Tartare(0) = "Aie"
Tartare(1) = "Aioli"
Tartare(2) = "Fines herbes"
Debug "On a le tableau suivant :"
For i = 0 To 3
Debug Str(i) + "= " + Tartare(i)
Next
Debug " "
*Adr = LastString(@Tartare() )
Debug "n° de la dernière chaîne créée : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
Debug "On défonce " + Tartare(2) + " avec KillString() pas avec Tartare(x) = " + Chr(34) + Chr(34)
KillString(Tartare(), 2)
*Adr = LastString(@Tartare() )
Debug "n° de la dernière chaîne créée : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
Procedure.L LastString(*Index) ;(Ollivier spéciale dédicace à Kcc)
! xor eax, eax
! mov edi, dword [p.p_Index]
! mov ebx, edi
! mov ecx, 0xFFFFFFFF
! cld
! REPNE SCASD ; >>> Une seule instruction ASM pour For: If PeekL() = 0: ExitFor: EndIf: Next
! mov eax, edi
! sub eax, ebx
! shr eax, 2
! sub eax, 2
ProcedureReturn
EndProcedure
Procedure KillString(Tmp.S(1), n.L)
Tmp(n) = "" ; Fred gère la mémoire
*ptr = @Tmp() ; on récupère l'adresse du tableau
! xor eax, eax ; on va écrire un LONG (=DWORD) = 0
! mov ebx, dword [p.v_n] ; on récupère le n de la chaîne
! shl ebx, 2 ; on le multiplie par 4 (car SizeOf(Long) = 4)
! mov edi, dword [p.p_ptr] ; on pointe le tableau
! add edi, ebx ; on se précise sur le pointeur à killer
! stosd ; on le kille
EndProcedure
Code : Tout sélectionner
Declare.L LastString(*Index)
Declare KillString(Tmp.S(1), n.L)
Declare NextNullString(*Index)
Dim Tartare.S(70)
Tartare(0) = "Aie"
Tartare(1) = "Aioli"
Tartare(2) = "Fines herbes"
Debug "On a le tableau suivant :"
For i = 0 To 3
Debug Str(i) + "= " + Tartare(i)
Next
Debug " "
*Adr = LastString(@Tartare())
Debug "n° de la dernière chaîne créée : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
Debug "On défonce " + Tartare(2) + " avec KillString() pas avec Tartare(x) = " + Chr(34) + Chr(34)
KillString(@Tartare(), 2)
*Adr = LastString(@Tartare())
Debug "n° de la dernière chaîne créée : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
*Adr = NextNullString(@Tartare())
Debug "n° de la prochaine chaine NUL : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
Procedure.L LastString(*Index) ;(Ollivier spéciale dédicace à Kcc)
! xor eax, eax
! mov edi, dword [p.p_Index]
! mov ebx, edi
! mov ecx, 0xFFFFFFFF
! cld
! REPNE SCASD ; >>> Une seule instruction ASM pour For: If PeekL() = 0: ExitFor: EndIf: Next
! mov eax, edi
! sub eax, ebx
! shr eax, 2
! sub eax, 2
ProcedureReturn
EndProcedure
Procedure KillString(Tmp.S(1), n.L)
Tmp(n) = "" ; Fred gère la mémoire
*ptr = @Tmp() ; on récupère l'adresse du tableau
! xor eax, eax ; on va écrire un LONG (=DWORD) = 0
! mov ebx, dword [p.v_n] ; on récupère le n de la chaîne
! shl ebx, 2 ; on le multiplie par 4 (car SizeOf(Long) = 4)
! mov edi, dword [p.p_ptr] ; on pointe le tableau
! add edi, ebx ; on se précise sur le pointeur à killer
! stosd ; on le kille
EndProcedure
Procedure.L NextNullString(*Index) ;(Ollivier spéciale dédicace à Kcc)
! xor eax, eax ; eax = 0
! mov edi, dword [p.p_Index] ; edi = pointeur index
! mov ebx, edi ; ebx = pointeur index
! mov ecx, 0xFFFFFFFF ; ecx = 4Go
! cld ; cld = recherche de bas en haut
! REPNE SCASD ; >>> Une seule instruction ASM pour For: If PeekL() = 0: ExitFor: EndIf: Next
! mov eax, edi ; eax = adresse trouvée
! sub eax, ebx ; eax = adresse trouvé - adresse tableau
! shr eax, 2 ; eax / 4
! sub eax, 3 ; eax - 3
ProcedureReturn
EndProcedure
Code : Tout sélectionner
On a le tableau suivant :
0= Aie
1= Aioli
2= Fines herbes
3=
n° de la dernière chaîne créée : 2 (Fines herbes)
On défonce Fines herbes avec KillString() pas avec Tartare(x) = ""
n° de la dernière chaîne créée : 1 (Aioli)
n° de la prochaine chaine NUL : 0 (Aie)
Est pas juste, il me semble ??n° de la prochaine chaine NUL : 0 (Aie)
Code : Tout sélectionner
Declare.L LastString(*Index)
Declare KillString(Tmp.S(1), n.L)
Declare NextNullString(*Index)
Dim Tartare.S(70)
Tartare(0) = "Aie"
Tartare(1) = "Aioli"
Tartare(2) = "Fines herbes"
Debug "On a le tableau suivant :"
For i = 0 To 3
Debug Str(i) + "= " + Tartare(i)
Next
Debug " "
*Adr = LastString(@Tartare())
Debug "n° de la dernière chaîne créée : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
Debug "On défonce " + Tartare(2) + " avec KillString() pas avec Tartare(x) = " + Chr(34) + Chr(34)
KillString(@Tartare(), 2)
*Adr = LastString(@Tartare())
Debug "n° de la dernière chaîne créée : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
*Adr = NextNullString(@Tartare())
Debug "n° de la prochaine chaine NUL : " + Str(*Adr) + " (" + Tartare(*Adr) + ")"
Procedure.L LastString(*Index) ;(Ollivier spéciale dédicace à Kcc)
! xor eax, eax
! mov edi, dword [p.p_Index]
! mov ebx, edi
! mov ecx, 0xFFFFFFFF
! cld
! REPNE SCASD ; >>> Une seule instruction ASM pour For: If PeekL() = 0: ExitFor: EndIf: Next
! mov eax, edi
! sub eax, ebx
! shr eax, 2
! sub eax, 2
ProcedureReturn
EndProcedure
Procedure KillString(Tmp.S(1), n.L)
Tmp(n) = "" ; Fred gère la mémoire
*ptr = @Tmp() ; on récupère l'adresse du tableau
! xor eax, eax ; on va écrire un LONG (=DWORD) = 0
! mov ebx, dword [p.v_n] ; on récupère le n de la chaîne
! shl ebx, 2 ; on le multiplie par 4 (car SizeOf(Long) = 4)
! mov edi, dword [p.p_ptr] ; on pointe le tableau
! add edi, ebx ; on se précise sur le pointeur à killer
! stosd ; on le kille
EndProcedure
Procedure.L NextNullString(*Index) ;(Ollivier spéciale dédicace à Kcc)
! xor eax, eax ; eax = 0
! mov edi, dword [p.p_Index] ; edi = pointeur index
! mov ebx, edi ; ebx = pointeur index
! mov ecx, 0xFFFFFFFF ; ecx = 4Go
! cld ; cld = recherche de bas en haut
! REPNE SCASD ; >>> Une seule instruction ASM pour For: If PeekL() = 0: ExitFor: EndIf: Next
! mov eax, edi ; eax = adresse trouvée
! sub eax, ebx ; eax = adresse trouvé - adresse tableau
! shr eax, 2 ; eax / 4
! sub eax, 1 ; eax - 3
ProcedureReturn
EndProcedure