Problem w Borland Builderze

0

Witam Was,
mam pytanie odnośnie problemu kompilacji kodu w buildrze, w codeblocks kompiluje się bez błędu, a w builderze przy już skompilowanym, uruchomionym programie, przy próbie zapisu do pliku txt wyskakuje błąd:

"Project Project1.exe raised exception class EAccessViolation with message 'Access violation at address ......."

tutaj fragment, który udało mi się namierzyć w dość długim kodzie:

       for(int j=9; j<ilosc; j++)
         {
             
             // wyrzuca błąd już po kompilacji, przy próbie zapisu do pliku txt
             // gdy oba wyłączę program nie wyrzuca błędu
             // tutaj problem z tymi dwoma liniami poniżej
             
            ++dlugosc_pl;
              prze1=vec2[j+lwlw];
          
             ......
             
         }

Jeśli ktoś ma pomysł, lub nakieruję w jakim kierunku mam iść by rozwiązać problem, to będę bardzo wdzięczny.

3

Błąd 'Access violation at address ......." to nie jest błąd kompilacji, to na 100% skutek próby odczytu/zapisu poza zakres przydzielonej pamięci.
Odpalasz pod debugerem i sprawdzasz czy przypadkiem na którymś kroku j+lwlw>=sizeof(vec2)/sizeof(*vec2) - można tą formułkę wpisać w polu condition przy pułapce.

0

Dziękuję za szybką odpowiedź, spróbuję to dzisiaj sprawdzić, już zrobiłem jedno podejście, choć nie wiem czy dobrze to uruchomiłem:

  • zaznaczony punkt w miejscu prze1=vec2[j+lwlw]; (czerwona kropka)
  • uruchomienie aplikacji F4
  • wklejenie w linijce przed w polu condition j+lwlw>=sizeof(vec2)/sizeof(*vec2)
  • próba zapisu przyciskiem zapisz (do pliku txt)
    na razie program nie wyrzuca błędu, aplikacja po prostu się zamraża, muszę dokładnie przeanalizować ten debuger, bo pewnie źle to robię...
    Jeszcze raz dziękuję za wskazówkę.
0

Nie zamraża się lecz wstaje na pułapce.

1

Najlepiej daj cały kod.

Swoja drogą nie ucz się od Zelent-a (pewnie dlatego używasz takiej staroci jak C++Builder).
Gość ma miękki przyjemny głos, coś tam umie, ale uczy od groma złych praktyk, ma poważne braki techniczne, które często wychodzą w jego filmach.

0

Kod jest długi, spagetti kod w sumie brzydko napisany, bez przemyślenia, szkoda Waszego czasu na analizę, problem chyba jest w vectorach - tablice stringów, bo błąd wyskakiwał wcześniej przy definiowaniu vector <string> vec i dopiero po zapisie vector<string>vec(ilosc) poszło dalej, ale w tym problem, że te tablice miały się "określać" podczas operacji według danych z pliku (bo różne wartości w różnych plikach). A debugerem doszedłem trochę dalej niż te dwie, linijki które podałem wyżej i dotyczył dlugosc_pl=0; ale nie ważne, muszę przemyśleć jeszcze raz działanie programu, albo zainstalować coś innego. Jestem totalnym amatorem, mój program ma tylko dwa przyciski i dwa radial buttony, a że miałem go już na komputerze, tak po lekcji Zelenta :)
to postanowiłem go użyć.

0

Więc używaj push_back()

0

tak używam push_back() i innych operacji typu pop_back() robię przesiew pliku wczytując z jednej tablicy stringów do drugiej, po drodze kasując lub dodając inne frazy

0

Panowie, jakie gui polecicie dla tak prostego człowieka jak ja, nie wymagam dużo - kilka przycisków, radial buttony jakieś pole do wpisania danych, tylko pod windows7 - Qt już nie obsługuje w7, Visual Studio 2022, miałem 800 błędów na wstępie i wszelaki naprawianie na nic się zdało. WxWidgets?

1

Najnowszy C++ Builder powinien chyba jeszcze na Win7 działać. Wersja darmowa (Community Edition) ma ograniczenie licencji do 5000 USD przychodu rocznie, czy jakoś tak.

0

Ja dla ćwiczenia piszę te programiki, więc okej, dzięki wielkie.

2

Borland Builder C++, string i 'Access violation at address'

Trochę będę strzelał. Powiedz mi, używasz może typu String? One mają taką nieprzyjemną właściwość, że indeksują się od 1 a nie od 0. W takim przypadku variable[0] będzie rzucało wyjątek ;)

0

Nie użyłem String w zasadzie kod jest przeklejony z Code Blocksa, dopisane są tylko przyciski otworz i zapisz, ogólnie dziwne rzeczy, bo niektóre dane z pliku przechodzą inne nie, potem te co nie przechodzily - przechodzą... rzuciłem to w pierony i zainstalowałem sobie wxWidgets w Code Blocksie, elegancko skończyłem i wszystko działa :D
Dziękuję Panowie za Odzew!

0
shnycell napisał(a):

elegancko skończyłem i wszystko działa :D

Jak pięknie sobie udowodniłeś błędy w IDE a nie we własnym kodzie.

Obstawiam, że po zmianie platformy Undefined Behaviour się nie ujawnia, a nie to, że go nie ma. Np jeździsz po pamięci, ale TYM RAZEM nie niszczysz wiodących danych, tylko inne.
Zwłaszcza jak widzę "elegancki" kod z pierwszego postu.

ps. podobne wyjątki w C/C++ lecą w miejscy X, ale rzeczywisty błąd kodu jest w miejscu Y

2
shnycell napisał(a):

Nie użyłem String w zasadzie kod jest przeklejony z Code Blocksa, dopisane są tylko przyciski otworz i zapisz, ogólnie dziwne rzeczy, bo niektóre dane z pliku przechodzą inne nie, potem te co nie przechodzily - przechodzą... rzuciłem to w pierony i zainstalowałem sobie wxWidgets w Code Blocksie, elegancko skończyłem i wszystko działa :D
Dziękuję Panowie za Odzew!

Zrzucanie winny na narzędzia i ciągłe ich zmienianie nigdzie cię nie zaprowadzi.
Tak jak pisałem POKAŻ CAŁY KOD, a dostaniesz wyjaśnienie co jest w nim nie tak. Nie zapomnij jeszce podać wyjasnienia co kod ma robić (treść zadania).

0

Na razie muszę go uporządkować itd. jest okolo 4000 linii i na pewno nie jest to napisane ze sztuką.
Program generuje gcode do pliku txt dla programu typu mach3 z warstw autocada. Programu już używałem na własne potrzeby frezowania cnc, tylko z konsoli, a potrzebowałem kilka kontrolek do zmiany parametrów, otwierania i zapisu, żeby trochę przyspieszyć pracę.

0

Problem był w tablicy dynamicznej, wystarczyło zamienić na zwykłą.

1 użytkowników online, w tym zalogowanych: 0, gości: 1