Page 58 of 77

Re: Помогите новичку

Posted: Tue Oct 08, 2013 4:56 pm
by punk_joker
Кроме как при помощи ф70.5 можно проверить существование файла? А то не хочется как то, выделять память под всю структуру.

Re: Помогите новичку

Posted: Tue Oct 08, 2013 5:13 pm
by Mario_r4
punk_joker wrote:Кроме как при помощи ф70.5 можно проверить существование файла? А то не хочется как то, выделять память под всю структуру.
Если включить воображение:
Spoiler:ф.70.1
* +12 = +0xC: dword: сколько байт читать, 1 байт.
З.Ы. Только для файлов, не для директорий.

Re: Помогите новичку

Posted: Tue Oct 08, 2013 6:49 pm
by punk_joker
Mario_r4 wrote:ф.70.1
* +12 = +0xC: dword: сколько байт читать, 1 байт.
З.Ы. Только для файлов, не для директорий.
Дело в том, что мне необходимы вариант как для файлов, так и для папок.

Re: Помогите новичку

Posted: Tue Oct 08, 2013 6:53 pm
by Serge
Mario_r4 wrote:Если включить воображение:
Это суровый метод апостола Фомы.
punk_joker wrote:А то не хочется как то, выделять память под всю структуру
Структура маленькая, выделяй место в стеке и не мучайся ненужными сомнениями.

Re: Помогите новичку

Posted: Tue Oct 08, 2013 7:14 pm
by 0CodErr
Mario_r4 wrote:ф.70.1
* +12 = +0xC: dword: сколько байт читать, 1 байт.
З.Ы. Только для файлов, не для директорий.
Для файлов ф.70.0 же.
punk_joker wrote:не хочется как то, выделять память под всю структуру.
Тебе жалко 40 байт?
В зависимости от задачи можно использовать всегда один и тот же буфер, не выделяя каждый раз новый. Но в этом случае в многопоточном приложении нужно следить, чтобы с этим буфером не пытались работать одновременно несколько потоков — использовать средства синхронизации.
punk_joker wrote:мне необходимы вариант как для файлов, так и для папок.
Поэтому ф70.5.

Re: Помогите новичку

Posted: Wed Oct 09, 2013 12:36 am
by Leency
Было в одном из файлов SHELL, поиск первого вхождения символа

Code: Select all

char* strchr(const char* string, int c)
{
	while (*string)
	{
		if (*string==c)
			return (char*)string;
		string++;
	}	
	return (char*)0;
}
Мне понадобилась похожая функция, только поиск не первого, а последнего вхождения символа. Набыдлогодил по быстрому, основываясь на предыдущем примере:

Code: Select all

char* strrchr(const char* string, int c)
{
	int last_found;
	while (*string)
	{
		if (*string==c)
		{
			last_found = string;
		}
		string++;
	}	
	return (char*)last_found;
}
Рабатает, но выдаёт ворнинги:

Code: Select all

system/string.c: In function 'strrchr':
system/string.c:133:15: warning: assignment makes integer from pointer without a
 cast [enabled by default]
    last_found = string;
Почему и как исправить?

Re: Помогите новичку

Posted: Wed Oct 09, 2013 12:52 am
by lev
вероятно надо:
char* last_found;
...
last_found = (char*)string;
...
return last_found;

Re: Помогите новичку

Posted: Wed Oct 09, 2013 7:44 am
by Mario_r4
0CodErr wrote:Для файлов ф.70.0 же.
Черт побери! А ты прав! :)
Вот что бывает, когда пытаешься и на работе работать и тут подрабатывать.

Re: Помогите новичку

Posted: Wed Oct 09, 2013 7:46 am
by Mario_r4
Serge wrote:Это суровый метод апостола Фомы.
Ну, мы тут все в чем то монахи, блин. В то время как космические корабли бороздят просторы больших театров...

Re: Помогите новичку

Posted: Wed Oct 09, 2013 12:33 pm
by Leency
lev wrote:вероятно надо:
char* last_found;
...
last_found = (char*)string;
...
return last_found;
char* - это указатель? В С-- указатель я использую dword, возможно это и неправильно.
(char*) - что значит эта конструкция?
return last_found; - почему в конче просто last_found?

Re: Помогите новичку

Posted: Wed Oct 09, 2013 1:38 pm
by SoUrcerer
(char*) var = преобразовать var к (char *), т.е. к указателю на char.

Re: Помогите новичку

Posted: Wed Oct 09, 2013 2:06 pm
by Insolor
Если объявить last_found как char *, то преобразование типов не нужно будет.
Т.е.

char* last_found;
...
last_found = string;
...
return last_found;

Re: Помогите новичку

Posted: Thu Oct 10, 2013 9:57 am
by Leency
Insolor wrote:Если объявить last_found как char *, то преобразование типов не нужно будет.
Т.е.

char* last_found;
...
last_found = string;
...
return last_found;
Оказывается нужно, т.к. const char* и char*

Re: Помогите новичку

Posted: Thu Oct 10, 2013 11:34 am
by Insolor
Leency wrote:
Insolor wrote:Если объявить last_found как char *, то преобразование типов не нужно будет.
Т.е.

char* last_found;
...
last_found = string;
...
return last_found;
Оказывается нужно, т.к. const char* и char*
Ок, только не "т.к. const char* и char*" (это ни о чем мне не говорит), а "warning: assignment discards qualifiers from pointer target type". Так что да, приведение все-таки нужно.

Re: Помогите новичку

Posted: Thu Oct 10, 2013 3:49 pm
by e-andrew
Указатели на указатели - многочисленное перенаправление

Такой вопрос. У меня, к примеру, в переменной var лежит число 5. Я сделал указатель на var, _var, а потом указатель на _var, __var. Как мне быстро узнать значение var, используя __var? Приходится использовать такой код:

Code: Select all

mov   eax, [__var]
dpd    [eax]
А хотелось бы что нибудь вроде

Code: Select all

dpd    [ [_var] ]
Для чего мне это нужно? Для куч.

Code: Select all

    use32
    org     0x0

;---------------------------------------------------------------------

    db	    'MENUET01'
    dd	    0x01, __START, __END, 0x1000, 0x1000, 0x0, 0x0

;---------------------------------------------------------------------

    include 'macros.inc'
    include 'debug.inc'

;=====================================================================
__START:
;=====================================================================

init_heap:
    mcall   68, 11
    cmp     eax, 0
    je	    exit

    mov     ecx, 4
    add     ecx, 4
    add     ecx, 1024
    mcall   68,  12

    mov     [buff.x], eax
    add     eax, 4
    mov     [buff.y], eax

;---------------------------------------------------------------------

main:
    mov     eax, [buff.x]
    mov     [eax], 10
    add     eax, 4
    mov     [eax], 20

;   ...     ...

;---------------------------------------------------------------------

exit:
    mcall   68, 13, [buff]
    mcall   -1

;---------------------------------------------------------------------

buff:
.x  rd      0
.y  rd      0

;=====================================================================
__END:
;=====================================================================
Есть ли способ?