nedoPC.org

Community of electronics hobbyists established in 2002

...
Atom Feed | View unanswered posts | View active topics It is currently 21 Jan 2021 18:04



Reply to topic  [ 78 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6  Next
Solid C - компилятор Си для Спринтера 
Author Message
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19321
Location: Silicon Valley
Reply with quote
Post 
Еще неувязочка:

Code:
   7. Имеется отличие от стандартного языка Си по эффективным пределам имен
членов структур и объединений (struct & union). В стандартном Си одно и то же
имя члена может появляться в двух различных структурах только в случае, когда
они оба одного типа и имеют одинаковое смещение в обеих структурах. Компилятор
SOLID C воспринимает имя члена так, как принято в Паскале или в Аде. Таким об-
разом, одно и то же имя члена может появляться в разных структурах и будет
правильно обработано компилятором SOLID C.
В качестве примера рассмотрим следующее описание:

struct node {
        char *word;
        int count;
        struct node *next;
} pool[1000], *p;

struct noad {
        int atr;
        struct noad *next;
} table[10], *q;

   В стандартном языке Си данная запись является неправильной, потому, что имя
члена "next" появляется в двух структурах - "node" и "noad", где их типы и сме-
щения не согласованы. Однако в среде компилятора SOLID C эти записи являются
правильными.
   Следует обратить внимание на следующую запись


Сдается мне, что вышеизложенное не соответствует действительности, т.е. в стандартном языке Си данная запись является вполне правильной и приемлемой!

_________________
:eugeek: https://twitter.com/Shaos1973


08 Oct 2004 17:51
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19321
Location: Silicon Valley
Reply with quote
Post 
И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?

_________________
:eugeek: https://twitter.com/Shaos1973


08 Oct 2004 17:53
Profile WWW
Doomed
User avatar

Joined: 11 Dec 2003 15:34
Posts: 407
Reply with quote
Post 
Shaos wrote:
И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?


Мне попадался Солид только для MSX-DOS. Автор Солида японская
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.

_________________
Vasil Ivanov
vasil-i@yandex.ru


10 Oct 2004 14:21
Profile
Doomed
User avatar

Joined: 11 Dec 2003 15:34
Posts: 407
Reply with quote
Post 
Shaos wrote:
Еще неувязочка:

Code:
   7. Имеется отличие от стандартного языка Си по эффективным пределам имен
членов структур и объединений (struct & union). В стандартном Си одно и то же
имя члена может появляться в двух различных структурах только в случае, когда
они оба одного типа и имеют одинаковое смещение в обеих структурах. Компилятор
SOLID C воспринимает имя члена так, как принято в Паскале или в Аде. Таким об-
разом, одно и то же имя члена может появляться в разных структурах и будет
правильно обработано компилятором SOLID C.
В качестве примера рассмотрим следующее описание:

struct node {
        char *word;
        int count;
        struct node *next;
} pool[1000], *p;

struct noad {
        int atr;
        struct noad *next;
} table[10], *q;

   В стандартном языке Си данная запись является неправильной, потому, что имя
члена "next" появляется в двух структурах - "node" и "noad", где их типы и сме-
щения не согласованы. Однако в среде компилятора SOLID C эти записи являются
правильными.
   Следует обратить внимание на следующую запись


Сдается мне, что вышеизложенное не соответствует действительности, т.е. в стандартном языке Си данная запись является вполне правильной и приемлемой!


Значит у япошек на то время был не тот стандарт Си ;)

_________________
Vasil Ivanov
vasil-i@yandex.ru


10 Oct 2004 14:32
Profile
Doomed
User avatar

Joined: 11 Dec 2003 15:34
Posts: 407
Reply with quote
Post 
Shaos wrote:
Кое что непонятно:

Code:
#include <stdio.h>

char buffer[4]="AAA";
//char buffer[4]={'A','A','A','A'};

void main()
{
    printf("0x%02X\n", *buffer);      // (1) не правильно!
    printf("0x%02X\n", (char *) *buffer);   // (2) правильно
}

Если массив buffer представляет собой char-элементы, то при обращении к нему,
как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно.
При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери-
ровал правильный код, к отдельному элементу char-массива нужно обращаться так,
как это сделано в строке (2), принудительно указав компилятору через cast-
операцию то, что нам нужно.
При обращении к массиву, состоящему из int-элементов, вышеописанных проблем
не возникает, компилятор генерирует правильный код.
Для более наглядного представления, о чем идет речь, можно просмотреть asm-
листинг, генерируемый компилятором для приведенного выше примера. Для строки
(1) компилятор не сгенерирует код "ld b,0".


Как я понимаю вместо
printf("0x%02X\n", (char *) *buffer);
надо писать
printf("0x%02X\n", (char) *buffer);
иначе ерунда какая-то получается


Нет. При обращении к char-массиву для printf надо писать не как

*buffer

а как

(char *) *buffer

Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.

_________________
Vasil Ivanov
vasil-i@yandex.ru


10 Oct 2004 14:39
Profile
Doomed
User avatar

Joined: 11 Dec 2003 15:34
Posts: 407
Reply with quote
Post 
Shaos wrote:
Vasil Ivanov wrote:
readme.rus - первое, что надо перевести. Здесь особенности пакета, портированного на Спринтер.


Черновичок перевода:
http://www.nedopc.org/forum/viewtopic.php?t=7580

Поместил в английском форуме про спринтер, так что по русски там не выражаться! ;)

Vasil Ivanov wrote:
Очень не помешала бы дока по си-функциям (clib.rus) данного
пакета, потому, что в некоторых функциях встречаются отличия
от стандартных (PC-шных), например функции перемещения
указателя в файле. Но она объемистая.


Предлагаю вместо этого осветить только отличные функции,
т.к. си есть си - кто знает, тот в курсе ;)

Vasil Ivanov wrote:
Да я фактически все доки и перечислил ;). По .rel/.irl
форматам и по асму, уже есть англицкий вариант.
Вобщем все доки, кроме cc.rus и clib.rus ты переведешь за
час, а может и быстрей ;).


.irl по английски не нашел

за час не получится - за час даже просто прочитать не получится, не то что написать ;)


IRL формат отличается от REL формата только тем, что имеет в начале
файла индексированный заголовок. Далее идет rel-имидж, его начало
выровнено на границу 128 байт. Чтобы из irl-формата сделать rel-формат,
надо просто убрать индексированный заголовок и все.
IRL-формат делает только библиотекарь ol.exe. Асм генерит обычные
rel-файлики. Ну линкер ессно понимает оба формата.
У меня где-то был IRL на англицком, если найду, то брошу тебе.

На счет отличных функций,.... надо время. Буду иметь это ввиду.

_________________
Vasil Ivanov
vasil-i@yandex.ru


10 Oct 2004 14:49
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19321
Location: Silicon Valley
Reply with quote
Post 
Vasil Ivanov wrote:
Shaos wrote:
Кое что непонятно:

Code:
#include <stdio.h>

char buffer[4]="AAA";
//char buffer[4]={'A','A','A','A'};

void main()
{
    printf("0x%02X\n", *buffer);      // (1) не правильно!
    printf("0x%02X\n", (char *) *buffer);   // (2) правильно
}

Если массив buffer представляет собой char-элементы, то при обращении к нему,
как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно.
При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери-
ровал правильный код, к отдельному элементу char-массива нужно обращаться так,
как это сделано в строке (2), принудительно указав компилятору через cast-
операцию то, что нам нужно.
При обращении к массиву, состоящему из int-элементов, вышеописанных проблем
не возникает, компилятор генерирует правильный код.
Для более наглядного представления, о чем идет речь, можно просмотреть asm-
листинг, генерируемый компилятором для приведенного выше примера. Для строки
(1) компилятор не сгенерирует код "ld b,0".


Как я понимаю вместо
printf("0x%02X\n", (char *) *buffer);
надо писать
printf("0x%02X\n", (char) *buffer);
иначе ерунда какая-то получается


Нет. При обращении к char-массиву для printf надо писать не как

*buffer

а как

(char *) *buffer

Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.


В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...

_________________
:eugeek: https://twitter.com/Shaos1973


10 Oct 2004 16:46
Profile WWW
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19321
Location: Silicon Valley
Reply with quote
Post 
Vasil Ivanov wrote:
Shaos wrote:
И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?


Мне попадался Солид только для MSX-DOS. Автор Солида японская
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.


Может имеет смысл указать на авторство в readme? И присовокупить доки от оригинального компиля?

_________________
:eugeek: https://twitter.com/Shaos1973


10 Oct 2004 16:55
Profile WWW
Doomed
User avatar

Joined: 11 Dec 2003 15:34
Posts: 407
Reply with quote
Post 
Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote:
И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?


Мне попадался Солид только для MSX-DOS. Автор Солида японская
фирма "ASCII", как и си-компилятора MSX-C. Насколько я в курсе.
На платформе x86 у них есть си-компилятор LSI v3.30c.


Может имеет смысл указать на авторство в readme? И присовокупить доки от оригинального компиля?


На авторство - нет проблем, засуну строчки. Кроме того, оно везде упоминается
в титлах программ пакета.
На счет оригинальных док - у меня их нет. Есть только доки к MSC-C
и они на русском (пробегали как-то по эхе ZX.SPECTRUM). Он отличается от Солида опциями компилятора, именами файликов и
юзает мелкософтские асм m80.com и линкер L80.com.

_________________
Vasil Ivanov
vasil-i@yandex.ru


13 Oct 2004 14:31
Profile
Doomed
User avatar

Joined: 11 Dec 2003 15:34
Posts: 407
Reply with quote
Post 
Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote:
Кое что непонятно:

Code:
#include <stdio.h>

char buffer[4]="AAA";
//char buffer[4]={'A','A','A','A'};

void main()
{
    printf("0x%02X\n", *buffer);      // (1) не правильно!
    printf("0x%02X\n", (char *) *buffer);   // (2) правильно
}

Если массив buffer представляет собой char-элементы, то при обращении к нему,
как показано в строке (1), компилятор сгенерирует не тот код, что нам нужно.
При этом, никакой ошибки выдано не будет. Для того, чтобы компилятор сгенери-
ровал правильный код, к отдельному элементу char-массива нужно обращаться так,
как это сделано в строке (2), принудительно указав компилятору через cast-
операцию то, что нам нужно.
При обращении к массиву, состоящему из int-элементов, вышеописанных проблем
не возникает, компилятор генерирует правильный код.
Для более наглядного представления, о чем идет речь, можно просмотреть asm-
листинг, генерируемый компилятором для приведенного выше примера. Для строки
(1) компилятор не сгенерирует код "ld b,0".


Как я понимаю вместо
printf("0x%02X\n", (char *) *buffer);
надо писать
printf("0x%02X\n", (char) *buffer);
иначе ерунда какая-то получается


Нет. При обращении к char-массиву для printf надо писать не как

*buffer

а как

(char *) *buffer

Можешь сравнить два варианта записи, по асм-листингам после 2-го
прохода си-компилятора.


В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...


В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.
Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста

Code:
#include <stdio.h>

char buffer[4]="AAA";

void main()
{
     printf("0x%02X\n", (char) *buffer);
}


Солид компилит следующий асм-листинг:

Code:
   ld   a,(buffer_)
   ld   c,a
                    ;<- 
   push   bc
   ld   bc,?63999
   push   bc
   ld   hl,2
   call   printf_
   pop   bc
   pop   bc
   ret


Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".

Для текста же

Code:
#include <stdio.h>

char buffer[4]="AAA";

void main()
{
     printf("0x%02X\n", (char *) *buffer);
}


Солид компилит правильный асм-листинг:

Code:
   ld   a,(buffer_)
   ld   c,a
                    ld                  b,0             ;<-
   push   bc
   ld   bc,?63999
   push   bc
   ld   hl,2
   call   printf_
   pop   bc
   pop   bc
   ret

_________________
Vasil Ivanov
vasil-i@yandex.ru


13 Oct 2004 15:03
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19321
Location: Silicon Valley
Reply with quote
Post 
Vasil Ivanov wrote:
Shaos wrote:
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...


В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.

Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста

Code:
#include <stdio.h>

char buffer[4]="AAA";

void main()
{
     printf("0x%02X\n", (char) *buffer);
}


Солид компилит следующий асм-листинг:

Code:
   ld   a,(buffer_)
   ld   c,a
                    ;<- 
   push   bc
   ld   bc,?63999
   push   bc
   ld   hl,2
   call   printf_
   pop   bc
   pop   bc
   ret


Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".

Для текста же

Code:
#include <stdio.h>

char buffer[4]="AAA";

void main()
{
     printf("0x%02X\n", (char *) *buffer);
}


Солид компилит правильный асм-листинг:

Code:
   ld   a,(buffer_)
   ld   c,a
                    ld                  b,0             ;<-
   push   bc
   ld   bc,?63999
   push   bc
   ld   hl,2
   call   printf_
   pop   bc
   pop   bc
   ret


Да - это глюк. А если попробовать вот так:

printf("0x%02X\n", *(char*)buffer);

кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си

_________________
:eugeek: https://twitter.com/Shaos1973


13 Oct 2004 17:31
Profile WWW
Maniac

Joined: 12 Oct 2004 14:49
Posts: 233
Reply with quote
Post 
Shaos wrote:
Я думаю никому и в страшном сне не присниться писать программы для ПЗУ на Си - поэтому ориентируйся на ОЗУ :)

Лучшая прошивка для Xbox - Xecuter 2 - написана на 100% C :)

Конкуренты-ассемблерщики просто неспособны обеспечить тот-же уровень надежности и функциональности.

Но для маленьких 8-бит устройств C - не вариант :)


14 Oct 2004 10:12
Profile
Maniac

Joined: 12 Oct 2004 14:49
Posts: 233
Reply with quote
Post 
Shaos wrote:
И еще вопрос - в каком виде и для каких систем существует "фирменная" версия SOLID C и кто ее автор?


SOLiD - это ник Егора Вознесенского. Он был отцом-основателем группы Novatec MSX. Он написал SOLiD C с нуля, используя совместимый синтакс и форматы обьектных файлов.

Вот несколько ссылок по теме:

http://www.getbanner.ru/novatec/index.htm

http://www.msx.org/forumtopic3286.html

http://www.mail-archive.com/msx@stack.nl/msg09371.html

http://opencollector.org/get_details.php?uid=118&src=summary

http://homepage3.nifty.com/Tatsu_syo/TMR/Install_SOLIDC.html


15 Oct 2004 09:28
Profile
Admin
User avatar

Joined: 09 Jan 2003 00:22
Posts: 19321
Location: Silicon Valley
Reply with quote
Post 
Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote:
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...


В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.

Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
...


Да - это глюк. А если попробовать вот так:

printf("0x%02X\n", *(char*)buffer);

кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си


Только что проверил сам - похоже, что %X вообще неработает с типами char - ни с *buffer, ни с buffer[0], ни просто с переменной типа char - прибавляется еще старший байт, НО если предварительно сделать присвоение int i = *buffer и именно этот int скормить принтфу - то все будет ок.

_________________
:eugeek: https://twitter.com/Shaos1973


15 Oct 2004 18:48
Profile WWW
Doomed
User avatar

Joined: 11 Dec 2003 15:34
Posts: 407
Reply with quote
Post 
Shaos wrote:
Vasil Ivanov wrote:
Shaos wrote:
В данном случае нам не нужен массив чаров - нам нужен первый элемент массива, т.к. 0x%02X. Далее, чтобы подучить первый элемент массива надо разыменовать указатель на него, т.е. *buffer. Ты говоришь, что компилятор это не просекает, т.е. надо писать (char)*buffer, но никак не (char*)*buffer, т.к. последнее означает преобразовать первый символ по указателю к указателю...


В папке Examples-ов в bin2c.c, откуда этот пример, обращение идет
именно как к чар-массиву.

Твои рассуждения правильны, но в отношении к данной версии Солида они не подходят. Только что проверил:
Для текста

Code:
#include <stdio.h>

char buffer[4]="AAA";

void main()
{
     printf("0x%02X\n", (char) *buffer);
}


Солид компилит следующий асм-листинг:

Code:
   ld   a,(buffer_)
   ld   c,a
                    ;<- 
   push   bc
   ld   bc,?63999
   push   bc
   ld   hl,2
   call   printf_
   pop   bc
   pop   bc
   ret


Что не верно - т.к. пропущена мнемоника "ld b,0" на месте "<-".

Для текста же

Code:
#include <stdio.h>

char buffer[4]="AAA";

void main()
{
     printf("0x%02X\n", (char *) *buffer);
}


Солид компилит правильный асм-листинг:

Code:
   ld   a,(buffer_)
   ld   c,a
                    ld                  b,0             ;<-
   push   bc
   ld   bc,?63999
   push   bc
   ld   hl,2
   call   printf_
   pop   bc
   pop   bc
   ret


Да - это глюк. А если попробовать вот так:

printf("0x%02X\n", *(char*)buffer);

кол-во звездочек такое же, но они переставлены и код является верным с точки зрения любого компилятора Си


И эту запись так же компилит с ошибкой. Поэтому я и говорю, что
имеем глюк компилятора.

_________________
Vasil Ivanov
vasil-i@yandex.ru


16 Oct 2004 12:05
Profile
Display posts from previous:  Sort by  
Reply to topic   [ 78 posts ]  Go to page Previous  1, 2, 3, 4, 5, 6  Next

Who is online

Users browsing this forum: No registered users and 1 guest


You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot post attachments in this forum

Search for:
Jump to:  
Powered by phpBB® Forum Software © phpBB Group
Designed by ST Software.