Как разобраться в синтаксической ошибке?
//
// USB.h - header file
//
// This file was generated using the RTX Application Wizard
// for Visual Studio.
//////////////////////////////////////////////////////////////////
#include <windows.h>
#include <rtapi.h>
//#include <stdio.h>
//#include <string.h>
//#include <ctype.h>
//#include <conio.h>
//#include <stdlib.h>
//#include <math.h>
//#include <errno.h>
// Add DEFINES Here
// Add Function prototypes Here
void RtWriteLPTPort(USHORT PortAddr ,BYTE Value)
{
_asm{
mov DX, PortAddr
mov AL, Value
out DX, AL
}
}
bool RtBIOSDetectPCI(void)
{
_asm {
mov AX, B101h
int 1Ah
jc &nopcibios
mov AX, 1
ret
&nopcibios:
xor AX, AX
ret
}
}
Приложение компилю в RTSSRelease Mode.
Ошибки:
USB.h(35) : error C2061: syntax error : identifier 'RtBIOSDetectPCI'
USB.h(35) : error C2059: syntax error : ';'
USB.h(35) : error C2059: syntax error : 'type'
USB.h(39) : error C2059: syntax error : 'bad suffix on number'
Пол дня уже эта тварь отняла, помогите.
Или, что можно понять из выражения:"плохо суффикс на номер"?
Сижу тут из паскалевского ассемблера переделываю в сишный, вот исходник из книги:
mov ax, 0b101h - тут 0 впереди не очень понял
int 1ah - вот тут, да?
jc @nopcibios
mov ax, 1
ret
@nopcibios:
xor ax, ax
ret
End;
1,2 те же.
3 (34) : error C2059: syntax error : ')'
Жалко к делфи нету этой примочки RTX, с удовольствием пересел бы на него.
{
_asm {
Mov AX, 0xB101
Int 0x1A
Jc &nopcibios
Mov AX, 0x1
Ret
nopcibios:
Xor AX, AX
Ret
}
}
С ассемблерным кодом разобрались, спасибо вам Alm3n.
А вот ошибки в сишном коде не могу увидеть.
В книге функция объявлена вот так:
Function DetectPCIBios: Boolean; assembler;
Может вместо ассемблер нужно чтото написать? Я написал register(т.к assembler он не хавает), но тогда появляются следующие ошибки:
(34) : error C2054: expected '(' to follow 'bool'
(34) : error C2085: 'RtBIOSDetectPCI' : not in formal parameter list
А где тогда можно писать функции целиком и подключать их без лишнего парева как в паскале?
И почему он первую хавает на ура?
С++ меня медленно убивает.
В с++ все прототипы описываются в .h, код функций пишется в .cpp. .h через include вставляется в cpp, который просто добавляется в проект.
Есть и несколько исключений из правила для классов и шаблонов.
Вообще, дайте код функции на том языке, с которого переводите. Нужно перевести на с++?
Проблема в том что я хочу расширить функционал RTX API, написать функции на ассемблере и оформить их как отдельный (по понятиям делфи) модуль. Реализовать это хочу самым простым способом, без всяких динамических библиотек и прочего мутора.
В общем нужно чтоб я мог писать функции в отдельном файле, а в основном .c файле мог их спокойно вызывать.
Проблема в том что я хочу расширить функционал RTX API, написать функции на ассемблере и оформить их как отдельный (по понятиям делфи) модуль. Реализовать это хочу самым простым способом, без всяких динамических библиотек и прочего мутора.
В общем нужно чтоб я мог писать функции в отдельном файле, а в основном .c файле мог их спокойно вызывать.
Если язык Си, то прототипы функций не обязательны, можно код сразу писать в .с файлах, подключаемых к проекту.
У меня сейчас есть USB.h и USB.c(главный фаил в котором всё происходит). Например я создам фаил myrtapi.c, в котором как я понимаю не должно быть таких проблем и можно будет написать несколько функций.
Как его потом подключить к USB.c?
Насчёт си или с++ походу я ошибся я выбирал при создании проекта тип проекта визуал с++, а он в итоге .с файлы ляпает
В .h файлах ещё объявляют константы и глобальные переменные, так что они тоже могут быть нужны.
К USB.c ничего подключать не нужно, его нужно будет добавить в проект, чтобы потом компилятор сделал из него объектный файл, точку входа в функцию линковщик найдёт сам. То есть, можно просто использовать функции, больше ничего не нужно.
Не смертельно, думаю, если в с++ будут функции без прототипа. Во всяком случае ошибок таких не было.
1) создал фаил myrtapi.c. Выбрал меню проект, в нём создать новый item(yне знаю перевода).
2) Написал в нем функции:
void RtWriteLPTPort(USHORT PortAddr ,BYTE Value)
{
_asm{
Mov DX, PortAddr
Mov AL, Value
Out DX, AL
}
}
//---------------------------------------------------------------------------------
bool RtBIOSDetectPCI(void)
{
_asm {
Mov AX, 0xB101
Int 0x1A
Jc &nopcibios
Mov AX, 0x1
Ret
nopcibios:
Xor AX, AX
Ret
}
}
//---------------------------------------------------------------------------------
Фаил myrtapi.c отображается в структуре проекта, но от этого не легче.
Вот такие теперь ошибки:
.\myrtapi.c(13) : error C2146: syntax error : missing ')' before identifier 'PortAddr'
.\myrtapi.c(13) : error C2061: syntax error : identifier 'PortAddr'
.\myrtapi.c(13) : error C2059: syntax error : ';'
.\myrtapi.c(13) : error C2059: syntax error : ','
.\myrtapi.c(13) : error C2059: syntax error : ')'
.\myrtapi.c(25) : error C2061: syntax error : identifier 'RtBIOSDetectPCI'
.\myrtapi.c(25) : error C2059: syntax error : ';'
.\myrtapi.c(25) : error C2059: syntax error : 'type'
Может, человек драйвер пишет. Отчего не будет-то?
PS: Аффтар как всегда решает не те задачи.
Это не драйвер, а даже если и драйвер, то кто ему ответит на
Буду теперь знать, что не работает под Windows это прерывание.
Например запись в LPT порт под виндой не идёт, пишет что не хватает привелегий для такой операции, а под этой хренью всё пишется без напрягов
Вот этот код например:
mov DX, PortAddr
mov AL, Value
out DX, AL
}
Так же написал на делфи завешивалку системы с максимальным для винды приоритетом. Так вот когда я запускаю завешивалку винда виснет намертво(не двигается мышка, не срабатывает капс лок на клаве), а это приложение работает дальше как ни в чём не бывало. При чём завешивалка именно загружает проц на сто пудов.
Осталось только с си разобраться, пока он не поддаётся моей логике.
Вы бы если это для вас не очень обременительно прокоментировали что я не так сделал.
Насчёт int 0x1a 'Это из книги, там автор предупреждает что под серией операционок NT работать не будет, так же предупреждали и про код для записи в порт.
Что значит "предупреждает"? То есть, вы знали, что работать не будет, но всё равно пишите?
Если смотреть с точки зрения виндовых колец защиты, то получается что это -1-е кольцо.
Я даже скажу больше по уверениям разработчиков этой хрени приложение продолжит работать как ни в чём не бывало если у винды вылезет так называемый экран смерти.
У этого приложения будет свой, зеленый экран смерти(в прямом смысле зелёный). Если чё нибудь не так закодю возможно его увижу, винде я так понял тоже будет в этот момент шабаш.
Но на компиляции застрял, пока не до этого.
Да является, гдето в недрах rtapi, я так понял тот же unsigned short. Для краткости записи.
http://en.wikipedia.org/wiki/Ring_(computer_security)
Мы об одном и том же?
Или это не с первого раза заметная шутка про (минус)1 кольцо?
Для всего, кроме Win 7:
http://kaimi.ru/2009/05/как-сделать-bsod-из-user-mode/
Для Win 7, но не программно, а через клавиатуру:
http://msdn.microsoft.com/en-us/library/ff545499(v=vs.85).aspx
Если проект студийный, то стоит попробовать переименовать файл из *.с в *.сpp.
Чё вы прицепились к этому кольцу? Я что написал что это -1-е кольцо в операционной системе виндовс?
Я лиш хотел сказать что происходит захват процессорного времени, и отдаётся винде в свободное время, а если загруженность большая не отдаётся вовсе. Ну и винда не мешает нормальному общению с процессором.
Переименовать вы считаете хорошая идея? Дело в том что среда сама создаёт их такими. Я в си и с++ не шарю но есть предположение что они создавались бы как .срр если бы этому чтото не препятствовало.
Не видел ни разу, чтобы в студии создавались .с файлы по умолчанию. Имею в виду Microsoft Visual Studio. В самом проекте, конечно, тоже нужно произвести изменения, иначе файл не будет включён.
Так как в си реализовать то о чём переписываемся? Алгоритм включения .с файла в проект чем то отличается от с++?
Сам фаил может содержать только функции и ничего более?
Нет, ничем. Если студия сама создаёт проект с таким расширением, то менять не нужно. Подумалось, что от расширения зависит то, как компилятор воспринимает код. Всё-таки Си и Си++ - не до конца одно и то же ну и из-за этого могли быть ошибки. Но теперь и не знаю, что ещё можно посоветовать.
Вот эта ошибка может случаться, в одном из случаев, из-за неверного типа идентификатора, так что лучше проверить существование типа USHORT.
А вот вторая компилится в таком виде:
{
_asm {
Mov AX, 0xB101
Int 0x1A
//Jc &nopcibios
Mov AX, 1
Ret
nopcibios:
Xor AX, AX
Ret
}
}
Видимо надо разбираться что там за Jc в паскалевском ассемблере.
И какие то напряги с типом bool, как только меняешь byte на bool перестаёт компилиться. Хотя мне уже пофиг(относится только к типу возвр. значения), bool же можно принять в переменную типа byte, надеюсь?(походу все эти напряги из за типа bool всё это время, я только недавно попробовал заменить) . Но както всё это странно, он выделяет слово bool синим цветом, и я не ожидал здесь подвоха.
Как в самом начале пишу функции в .h файле(так както кажется удобней).
С Jc вроде разобрался, нужно не Jc &nopcibios, а Jc nopcibios(по крайней мере с точки зрения компиляции, с точки зрения функционирования ещё не проверил, там еще перед проверкой подкодить кое чё нужно).
Всем спасибо.
Alm3n, особый респект и уважуха! Не бросил в беде.
Кто раньше на си кодил наверное нужно выдавать молоко за вредность. )))
Да я уже понял, типа bool нету, слова true и false не понимаем.
Интересно чего там ещё нету ? По ходу не легкий меня ждёт кодинг.
Итак чайник кипит от си подобных языков, а тут еще такой прикол, слова выделяем синим но не понимаем.
Или это не с первого раза заметная шутка про (минус)1 кольцо?
Не понял тебя,но про -1е кольцо вижу впервые
Он во всём проекте будет только одна копия этого файла, в нём специальная "защита" от дублирования есть.
"Паскалевского" ассемблера нет. Jc - jump carry, переход по переносу, то есть, когда в результате, например, сложения, сумма не помещается полностью в переменную, тогда единица самого старшего разряда числа переносится во флаг CF, ну и переход сработает.
В Си любое ненулевое значение любой переменной распознаётся, как истина.
Разница между &nopcibios и без амперсанда в том, что в первом случае берётся адрес переменной nopcibios, а во втором значение, которое в ней находится. Но это не переменная, сдаётся мне. Стоит почитать про метки(label) в Си.
Ничего личного, но помогать вам больше не смогу.
А это о чём?