ANTICHAT.XYZ    VIDEO.ANTICHAT.XYZ    НОВЫЕ СООБЩЕНИЯ    ФОРУМ  
Баннер 1   Баннер 2

ANTICHAT — форум по информационной безопасности, OSINT и технологиям

ANTICHAT — русскоязычное сообщество по безопасности, OSINT и программированию. Форум ранее работал на доменах antichat.ru, antichat.com и antichat.club, и теперь снова доступен на новом адресе — forum.antichat.xyz.
Форум восстановлен и продолжает развитие: доступны архивные темы, добавляются новые обсуждения и материалы.
⚠️ Старые аккаунты восстановить невозможно — необходимо зарегистрироваться заново.
Вернуться   Форум АНТИЧАТ > Программирование_OLD > С/С++, C#, Delphi, .NET, Asm
   
 
 
Опции темы Поиск в этой теме Опции просмотра

  #3751  
Старый 07.06.2009, 21:08
KaZ@NoVa
Постоянный
Регистрация: 05.07.2008
Сообщений: 555
Провел на форуме:
3134311

Репутация: 1467


Отправить сообщение для KaZ@NoVa с помощью ICQ Отправить сообщение для KaZ@NoVa с помощью AIM Отправить сообщение для KaZ@NoVa с помощью Yahoo
По умолчанию

Цитата:
Сообщение от zeppe1in  
есть длл. длл загружается и запускает поток. этот поток использует глобальный массив. дак вот он его использует всё хорошо работает. дописываю строчку кода и этот массив становится недоступен. похоже это как то связано с размером процедуры потока. проблемму впринципе решил но интерестно в чом прикол был.
Я к сожалению в потоках особо не разобрался, но могу сказать если ты писал под билдером или делфой, скорее всего это результат ошибок этих сред, ну и потом, глобальные переменные это не лучшее решение и тем более массив.
 

  #3752  
Старый 07.06.2009, 22:44
МongBa†
Познающий
Регистрация: 12.05.2009
Сообщений: 45
Провел на форуме:
255342

Репутация: 28
Отправить сообщение для МongBa† с помощью ICQ
По умолчанию

Угу... есть такая трабла на Делфи
обычно спасаюсь глобальной переменной crit.. в кажом потоке:
if crit then sleep(10);
crit:=true;
// действия с глоб массивом
crit:=false;
 

  #3753  
Старый 08.06.2009, 00:08
slesh
Reservists Of Antichat - Level 6
Регистрация: 05.03.2007
Сообщений: 1,985
Провел на форуме:
3288241

Репутация: 3349


Отправить сообщение для slesh с помощью ICQ
По умолчанию

Вообще такие вещи делаются через критические секции типа
Код:
var
 CS:TRTLCriticalSection; // глобальная переменная
.......
при старте проги делаешь:
 InitializeCriticalSection(CS);
.....
в потоках делаешь:
 EnterCriticalSection(CS);
 тут идут нужные действия.
 LeaveCriticalSection(CS);
после выполнения EnterCriticalSection
система приостанавливает все потоки программы и выполняет код который идет далее.
Затем после LeaveCriticalSection система опять разрешает работу других потоков.
т.е. какбы синхронизация но на уровне ядра и просчитана более лучше.
 

  #3754  
Старый 08.06.2009, 00:14
Agregat
Новичок
Регистрация: 15.05.2009
Сообщений: 11
Провел на форуме:
7498

Репутация: 0
По умолчанию

Помогите сделать считывание матрицы из текстового файла в данной программе:
Код:
uses crt;

type
     PtrStr = ^Str;
     Str = array [1..1] of integer;

     PtrMatr = ^Matr;
     Matr = array [1..1] of PtrStr;

var
     matrica: PtrMatr;
     razmer, i, j: integer;

procedure CreateMatr;
begin
    write ('razmernost matricy: ');
    readln(razmer);

    getmem(matrica, razmer*SizeOf(PtrStr));

    for i:=1 to razmer do
    getmem(matrica^[i], razmer*SizeOf(integer));

    writeln('vvodim elementy:');
    for i:=1 to razmer do
        for j:=1 to razmer do
            readln(matrica^[i]^[j]);

end;    

    procedure destroymatrix;
    begin

    for i:=1 to razmer do
    freemem(matrica^[i], razmer*SizeOf(integer));

    freemem(matrica, razmer*SizeOf(PtrStr));


    end;

    procedure otobrajenie;
    begin
     for i:=1 to razmer do
      begin
        writeln;
        for j:=1 to razmer do
           write(matrica^[i]^[j]:5);
      end;
      writeln;
     end;


 procedure sortirovka;
    var buffer1, buffer2, buffer3: integer;
    begin
    buffer3:=1;
      for i:=1 to razmer do
      begin
       buffer1:= matrica^[i]^[1];
       buffer2:= matrica^[i]^[i];
       for j:=0 to razmer-1 do
          begin
          if matrica^[i]^[j+1] <= buffer1  then
            begin
            buffer3:=j+1;
            buffer1:=matrica^[i]^[j+1];
            end;
            matrica^[i]^[buffer3]:=buffer2;
            matrica^[i]^[i]:=buffer1;
          end;
       end;
    end;


begin
 clrscr;
 CreateMatr;
 otobrajenie;
 sortirovka;
 otobrajenie;
 destroymatrix;
 readln;
end.
 

  #3755  
Старый 08.06.2009, 00:53
eLWAux
Members of Antichat - Level 5
Регистрация: 15.06.2008
Сообщений: 941
Провел на форуме:
5111568

Репутация: 2399


Отправить сообщение для eLWAux с помощью ICQ
По умолчанию

Agregat, предлагаешь тебе лабу сделать?

Код:
procedure CreateMatr;
var
  F : text;
begin
  write ('razmernost matricy: ');
  readln(razmer);

 assign(F,'README');
 reset(F);
 читаешь пока не eof(F) и записываешь в элемент матрицы
end;
 

  #3756  
Старый 08.06.2009, 01:50
blednii
Участник форума
Регистрация: 12.06.2007
Сообщений: 160
Провел на форуме:
357904

Репутация: 44
Отправить сообщение для blednii с помощью ICQ Отправить сообщение для blednii с помощью Yahoo
По умолчанию

Подскажите как в таком коде сделать чтоб было возможно вводить только целые числа больше 0

Код:
procedure TMainForm.Button1Click(Sender: TObject);
begin
if Length(Edit1.Text) = 0 then
begin
ShowMessage('Надо ввести состояние нового предмета');
exit;
end;
kachestvo1:=StrToInt(Edit1.Text);
if Length(Edit2.Text) = 0 then
begin
ShowMessage('Надо ввести состояние предмета по факту');
exit;
end;
kachestvo2:=StrToInt(Edit2.Text);
if Length(Edit3.Text) = 0 then
begin
ShowMessage('Надо ввести цену нового изделия');
exit;
end;
cenanovogo:=StrToInt(Edit3.Text);
if Length(Edit4.Text) = 0 then
begin
ShowMessage('Надо ввести размер комисcии');
exit;
end;
komissija:=StrToInt(Edit4.Text);
cenapokupki:=kachestvo1 / kachestvo2 * cenanovogo * (1-komissija/100);
Label6.Caption:=FloatToStr(cenapokupki);
cenaprodagi:=kachestvo1 / kachestvo2 * cenanovogo;
Label8.Caption:=FloatToStr(cenaprodagi);
end;
с меня +
=)
 

  #3757  
Старый 08.06.2009, 02:12
МongBa†
Познающий
Регистрация: 12.05.2009
Сообщений: 45
Провел на форуме:
255342

Репутация: 28
Отправить сообщение для МongBa† с помощью ICQ
По умолчанию

Код:
if Length(Edit1.Text) = 0 then
begin
ShowMessage(Надо ввести состояние нового предмета');
exit;
nd;

try
if strtoint(Edit1.Text)<=0 then
begin
ShowMessage('Надо ввести число больше 0');
Exit;
end;
except
ShowMessage('Надо ввести целое число!');
Exit;
end;
 

  #3758  
Старый 08.06.2009, 02:17
blednii
Участник форума
Регистрация: 12.06.2007
Сообщений: 160
Провел на форуме:
357904

Репутация: 44
Отправить сообщение для blednii с помощью ICQ Отправить сообщение для blednii с помощью Yahoo
По умолчанию

Нето немножко, необходимо чтоб вводились только цифры
 

  #3759  
Старый 08.06.2009, 02:27
cremator (c)
Постоянный
Регистрация: 20.06.2008
Сообщений: 323
Провел на форуме:
1240829

Репутация: 165
Отправить сообщение для cremator (c) с помощью ICQ
По умолчанию

blednii, тебе всё правильно написали! Если будет введено не число то вылезет ошибка ShowMessage('Надо ввести целое число!');
 

  #3760  
Старый 08.06.2009, 02:33
МongBa†
Познающий
Регистрация: 12.05.2009
Сообщений: 45
Провел на форуме:
255342

Репутация: 28
Отправить сообщение для МongBa† с помощью ICQ
По умолчанию

Цитата:
Сообщение от blednii  
Нето немножко, необходимо чтоб вводились только цифры
Понял что имеетсо =)
в евенте эдита:
Код:
procedure TForm1.Edit1KeyPress(Sender: TObject; var Key: Char);
begin
 if (Key<'0') or (Key>'9') then Key:=chr(0);
end;
Чуть не забыл, держи с бекспейсом: if ((Key<'0') or (Key>'9')) and (ord(Key)<>8) then Key:=chr(0);

Последний раз редактировалось МongBa†; 08.06.2009 в 02:45..
 
 





Здесь присутствуют: 1 (пользователей: 0 , гостей: 1)
 


Быстрый переход




ANTICHAT.XYZ