ExtractStrings a TStrings – Delphi – Fórum – Programujte.com
 x   TIP: Přetáhni ikonu na hlavní panel pro připnutí webu

ExtractStrings a TStrings – Delphi – Fórum – Programujte.comExtractStrings a TStrings – Delphi – Fórum – Programujte.com

 

oxidián0
Grafoman
1. 5. 2018   #1
-
0
-
  1. Připojen obrázek. Proč je pole TestFolderInfo prázdné? Očekával bych dvě položky: Latina a 0

    var TestFolderInfo: TStrings;    
    procedure ...
    begin
    TestFolderInfo := TStringList.Create;
    for i:=0 to maxTestFolders-1 do
     begin;
       readln(f,line);
       TestFolderInfo.clear;
       try
         ExtractStrings([';'], [], PChar(line), TestFolderInfo);
       finally
       end;
    end; end;

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
1. 5. 2018   #2
-
0
-

Já bych očekával to samé. Jseš si jistý, že je prázdný?

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
1. 5. 2018   #3
-
0
-

Ano, mám to zobrazené v kukátku a krokuju to v debugeru.

      begin;
        readln(f,line);
        TestFolderInfo.clear;
        try
          ExtractStrings([';'], [], PChar(line), TestFolderInfo);
          if (line='') or ( (line[1]='0') and (trim(line)='0;' ) ) then
            begin
              SubMenuItemsLoaded[pos] := false;
              JazykyFolders[pos] := '';
              JazykySelected[pos] := '';
              continue;
            end;
          pos := JazykyIndexy.IndexOf(TestFolderInfo[0]);
          if pos<>-1 then
            begin
              SubMenuItemsLoaded[pos] := true;
              JazykyFolders[pos] := TestFolderInfo[0];
              if not (DirectoryExists(TestyDir+'\'+JazykyFolders[pos])) then
                 begin
                   CreateDir(TestyDir+'\'+JazykyFolders[pos]);
                   showmessage('Adresář jsem zkusil vytvořit automaticky: '+TestyDir+'\'+JazykyFolders[pos]);
                   ; JazykyFolders[pos] := '';
                   SubMenuItemsLoaded[pos] := false;
                 end
              else
              try
                c := c-1; // potvrdit, že složka s jazykem byla asociována
                JazykySelected[pos] := TestFolderInfo[2];
                if TestFolderInfo[2]='0' then
                  JazykySelected[pos] := ''
                else
                  if not (DirectoryExists(TestyDir+'\'+JazykyFolders[pos]+'\'+JazykySelected[pos])) then
                     begin
                     showmessage('Cesta testu nenalezena: '+TestyDir+'\'+JazykyFolders[pos]+'\'+JazykySelected[pos]);
                     JazykySelected[pos] := '';
                     end;
              except
                JazykySelected[pos] := '';
              end;

            end
          else
            begin // adresář není specifikován
              JazykyFolders[pos] := '';
              SubMenuItemsLoaded[pos] := false
            end;
        finally
        end;
Nahlásit jako SPAM
IP: 78.102.61.–
Sniper
~ Anonymní uživatel
215 příspěvků
1. 5. 2018   #4
-
0
-

Tvůj kód jsem nezkoušel (neb se v něm nevyznám), ale tohle: 

procedure Foo;
var
  Str:  String;
  Line: TStringList;
  i:    Integer;
begin
Str := 'Latina;0';
Line := TStringList.Create;
try
  WriteLn(ExtractStrings([';'],[],PChar(Str),Line));
  WriteLn;
  For i := 0 to Pred(Line.Count) do
    WriteLn(Line[i]);
finally
  Line.Free;
end;
end;

...funguje jak má. Takže chyba bude jinde.

Nahlásit jako SPAM
IP: 92.240.176.–
gna
~ Anonymní uživatel
1891 příspěvků
1. 5. 2018   #5
-
0
-

#3 oxidián
Zkus se ještě podívat, co ti vrací ten PChar. Myslím si, že v D7 je všechno AnsiString, takže by neměl být problém, ale nic jiného mě nenapadá.

Jinak u vyšších verzí jsou i zdrojáky, tak se můžeš podívat na čem to klekne. Našel jsem třeba tady.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
1. 5. 2018   #6
-
0
-

#4 Sniper
No a mě toto nefunguje:

procedure Foo;
var
  Str:  String;
  Line: TStringList;
  i:    Integer;
begin
  Str := 'Latina;0';
  Line := TStringList.Create;
  ExtractStrings([';'],[],PChar(Str),Line);
  Line.Free;
end;


To jsem jen zkrátil tvůj kód. V kukátku vidím Line = (). Stojím na řádku Line.Free;

procedure Foo;
var
  Str:  String;
  Line: TStringList;
  i:    Integer;
  ptest: PChar; // console: warning Unsafe type PChar
begin
Str := 'Latina;0';
Line := TStringList.Create;
try
  ptest := PChar(Str); // // console: warning Unsafe type PAnsiChar
  ExtractStrings([';'],[],PChar(Str),Line);
  finally
  Line.Free;
end;
end;


Viz comment, funkce vrací typ PAnsiChar

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
1. 5. 2018   #7
-
0
-

A pořád všude try blok. Jestli to háže vyjímku, tak je asi něco blbě.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
1. 5. 2018   #8
-
0
-

#7 gna
Vyjímku to nehází, už jsem ten try block odstranil.

V kukátku mám hlášku že proměnná ptest není přistupná due to optimalization

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
1. 5. 2018   #9
-
0
-

#6 oxidián
A má ten ptest správnou hodnotu?

pc^ = 'L', (pc+1)^ = 'a', (pc+2)^ = 't' ?

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
1. 5. 2018   #10
-
0
-

#9 gna

No právě: Variable 'ptest' inaccessible here due to optimization

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
1. 5. 2018   #11
-
0
-

Problém s hláškami jsem vyšešil, ale co jsem nevyřešil je ten pTest, proč není přístupný v kukátku uvnitř funkce. Prá nějaká optimalizace.

Nahlásit jako SPAM
IP: 78.102.61.–
Sniper
~ Anonymní uživatel
215 příspěvků
1. 5. 2018   #12
-
+1
-
Zajímavé

Proměnné pTest je ve chvíli, kdy se na ní díváš, už nepřístupná/neexistuje. Ano, je to optimalizace, aby tam proměnný nezacláněli dýl, než je třeba.

Blok try-finally má svůj důvod - memory leak ti nic neříká?

Nebezpečný type casting ti to hlásí proto, že referencuješ obsah managed typu, tudíž nemáš vůbec žádnou kontrolu nad jeho obsahem mimo kód kde se používá.

Nahlásit jako SPAM
IP: 92.240.176.–
Sniper
~ Anonymní uživatel
215 příspěvků
1. 5. 2018   #13
-
0
-

Mimochodem tyhle unsafe hlášky jdou vypnout v nastavení, což bys taky měl udělat.

Nahlásit jako SPAM
IP: 92.240.176.–
Sniper
~ Anonymní uživatel
215 příspěvků
1. 5. 2018   #14
-
+1
-
Zajímavé

A ještě, watcher ti nic neukazuje protože Line je objekt ke kterému nemáš zdroje, tudíž delphi neznají jeho strukturu a nemají ti co ukázat. Pokud bys měl zdrojáky tak ti to vypíše všechny jeho parametry.

Nahlásit jako SPAM
IP: 92.240.176.–
oxidián0
Grafoman
1. 5. 2018   #15
-
0
-

Dobře, tak už chápu. Je to objekt, tedy se k tomu nedá přistupovat jako k poli.

Řeším tedy jak zkopírovat položky do pole nebo jak zkopírovat string z položky i do jiného stringu (tedy jak zpřístupnit ten string pomocí i).

Edit:

Tak zpřístupnit to mohu pomocí

Line.Strings[0], Line.Strings[1]

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
1. 5. 2018   #16
-
0
-

Díky za rady, já už jsem skoro hotov.

Tohle mi nefunguje:

JazykySelected[pos] := TestFolderInfo.count>1 ? TestFolderInfo.Strings[2] : 0;

[Error] UC_HEB1.PAS(630): Illegal character in input file: '?' ($3F)

Nahlásit jako SPAM
IP: 78.102.61.–
Sniper
~ Anonymní uživatel
215 příspěvků
1. 5. 2018   #17
-
0
-

Protože je nesmyslná syntaxe. Tohle je Delphi, ne C++, tady nejsou ternární operátory. Nemluvě o tom, že se tam pokoušíš přiřadit dva různý typy (string a integer).

Nahlásit jako SPAM
IP: 92.240.176.–
oxidián0
Grafoman
1. 5. 2018   #18
-
0
-

A když mám pole stringů

Jazyky : Array [0..maxTestItems-1] of string; // celkem 11 položek, ale iniciuje se jich jen 10, protože v souboru ze kterou čtu jazyky je jen 10 položek.

provedu iniciaci / načtení jazyků do pole...

A na konci pomocí smyčky přiřazuju str := ...

  for i:=0 to maxSubFolders-1 do
    begin;
    j := length(submenuitems); // i - index submenu
    setlength(submenuitems,j+1);
    str := Jazyky[i];
    // dále zpracuju str...
    // a při 11 položce to krachne
end;


Jak zkontrolovat jestli Jazyky[i] je nastaveno ještě před tím než to zkusím přiřadit tomu str?

Konkrétně mi to dává hlášku: Access violition at address ...

Nahlásit jako SPAM
IP: 78.102.61.–
Sniper
~ Anonymní uživatel
215 příspěvků
1. 5. 2018   #19
-
0
-

Neb v tom máš nepořádek, pole má velikost maxTestItems, ale pracueš s maxSubFolders položkami. Jsi si jistý, že maxTestItems je 11, nebo že maxSubFolders  je menší nebo rovno maxTestItems?

Nahlásit jako SPAM
IP: 92.240.176.–
gna
~ Anonymní uživatel
1891 příspěvků
1. 5. 2018   #20
-
0
-

To pole je automaticky naplněné prázdnými stringy. Spíš bych tipnul, že máš index 11, ale počítáno od 0 je to 12. položka, takže mimo pole. Samozřejmě můžeš použít Length, resp. Low/High pro testování platnosti indexu.

Se zapnutými "range checks" {$R+} by to mělo hodit vyjímku, ale jinak to klidně vezme neplatnou hodnotu jako string a klekne to až na Access Violation když s ním něco děláš. Takže alespoň pro ladění to doporučuji zapnout.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
1. 5. 2018   #21
-
0
-

#20 gna
To ale nevím kde se to zapíná kam to mám zapsat nebo kde to nastavit. To jako v nastavení compilátoru?

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
1. 5. 2018   #22
-
0
-

#19 Sniper
Vracím se po dlouhé době k rozdělanému kódu, není lehké zjistit jak jsem to chtěl původně udělat.

maxSubFolders je 255, a původně jsem tam měl repeat .... tak jo mám v tom chaos.

Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
1. 5. 2018   #23
-
0
-

#21 oxidián
Je to někde ve vlastnostech projektu, nebo to můžeš napsat přímo do zdrojáku.

Nahlásit jako SPAM
IP: 213.211.51.–
oxidián0
Grafoman
2. 5. 2018   #24
-
0
-

Runtime errors: Range checking

Nahlásit jako SPAM
IP: 78.102.61.–
MilanL+1
Grafoman
2. 5. 2018   #25
-
+1
-
Zajímavé

#24 oxidián
čau Oxi, to furt děláš na tom zkoušení slovíček v těch starých jazycích?

Jak zkontrolovat jestli Jazyky[i] je nastaveno ještě před tím než to zkusím přiřadit tomu str?

if i < length(Jazyky)

Nahlásit jako SPAM
IP: 91.139.9.–
oxidián0
Grafoman
2. 5. 2018   #26
-
0
-

#25 MilanL
Čau, no tak já jsem na tom nějakou dobu nedělal, nevím ani kolik uplynulo času.

Nahlásit jako SPAM
IP: 78.102.61.–
oxidián0
Grafoman
2. 5. 2018   #27
-
0
-

Jak zpřístupnit první znak z položky seznamu?

Raw := TStringList.Create;

// pak přidám data do seznamu

Raw.Strings[0][0]; // teď chci vrátit první znak z první položky
Nahlásit jako SPAM
IP: 78.102.61.–
gna
~ Anonymní uživatel
1891 příspěvků
2. 5. 2018   #28
-
0
-

#27 oxidián
První znak má index 1.

Nahlásit jako SPAM
IP: 213.211.51.–
Zjistit počet nových příspěvků

Přidej příspěvek

Toto téma je starší jak čtvrt roku – přidej svůj příspěvek jen tehdy, máš-li k tématu opravdu co říct!

Ano, opravdu chci reagovat → zobrazí formulář pro přidání příspěvku

×Vložení zdrojáku

×Vložení obrázku

Vložit URL obrázku Vybrat obrázek na disku
Vlož URL adresu obrázku:
Klikni a vyber obrázek z počítače:

×Vložení videa

Aktuálně jsou podporována videa ze serverů YouTube, Vimeo a Dailymotion.
×
 
Podporujeme Gravatara.
Zadej URL adresu Avatara (40 x 40 px) nebo emailovou adresu pro použití Gravatara.
Email nikam neukládáme, po získání Gravatara je zahozen.
-
Pravidla pro psaní příspěvků, používej diakritiku. ENTER pro nový odstavec, SHIFT + ENTER pro nový řádek.
Sledovat nové příspěvky (pouze pro přihlášené)
Sleduj vlákno a v případě přidání nového příspěvku o tom budeš vědět mezi prvními.
Reaguješ na příspěvek:

Uživatelé prohlížející si toto vlákno

Uživatelé on-line: 0 registrovaných, 7 hostů

 

Hostujeme u Českého hostingu       ISSN 1801-1586       ⇡ Nahoru Webtea.cz logo © 20032024 Programujte.com
Zasadilo a pěstuje Webtea.cz, šéfredaktor Lukáš Churý