Re: Hur nära kan man komma åt hårdvaran via C vs C++?
Postat: 18 september 2014, 18:47:45
Lisp nedåtgående? Inte så länge Emacs finns:)
Svenskt forum för elektroniksnack.
https://elektronikforumet.com/forum/
Pascal är väl konstruerat för utbildning, inte för "riktig" programmering?Nerre skrev:Jag skrev "stort programmeringsspråk", B var väl aldrig så stort?Al_Bundy skrev:B är utdött. Pascal och COBOL är väll också utdöende språk.
Pascal används som sagt var i Delphi, jag tror inte Cobol är helt utdött heller. Det finns i alla fall en OpenCobol som fick sin senaste uppdatering 28 augusti i år.
AdaJan Almqvist skrev:Frågan är snarare vilka andra språk än C som kan prata med register och HW-io eller om man vill, att kunna tillverka en drivrutin till en specifik hårdvara i stort sett helt och hållet i språket
Kod: Markera allt
declare
type Byte is range 0..255;
for Byte'Size use 8;
for Byte'Alignment use 8;
A:Byte;
for A'Address use 16#000000F7#;
begin
null;
end;
Och bara för att du aldrig använt Emacs så finns den inte eller?TomasL skrev:ärligt talat, de enda gångerna jag stött på LISP är med AutoCad, på DOS-tiden
Nej men det handlade det ju inte om här, det var ett sidospår om vilka språk som eventuellt är utdöda idag.xxargs skrev:Ingen av dessa (inte java heller) är direkt kända för lågnivåpill...
Jag vet inte om allt är helt korrekt enligt C, men ungefär kan man göra så här: (inte helt komplett)Al_Bundy skrev:Kan inte du visa en exempelkod av C som är objektorienterad? Ta något enkelt t.ex bil, färg, modell osv?
Kod: Markera allt
/******************** datastrukturer - bilar - ägare ***********************/
#define STRLEN 20 // max antal tecken i en textsträng inkl avslut (\0x00)
// *** enumerationslistor *** //
typedef enum {ej_def, vit, gul, gron, rod, bla, svart, annan} fargTyp;
typedef enum {ej_def, volvo, saab, renault, vw, annan} modellTyp;
// typdeklaration person - innehåller data om person: namn, adress, telefonnummer, antal fordon, länk till fordonslista
typedef struct {
char namn[STRLEN]; // namn
char adress[STRLEN]; // adress
char namn[STRLEN]; // telefonnummer inkl riktnummer
int antal_fordon; // antal fordon i registret kopplad till denna ägare
bil *lista // länk till bil-registret
} person;
// typdeklaration bil - innehåller data om ägare, färg, modell mm...
typedef struct {
modellTyp modell; // bilmodell
fargTyp farg; // färg
person *agare // länk till ägare
} bil;
/*************** variabler ******************/
person folkbokforing[1000]; // lista på alla medborgare, max 1000 personer
bil bilregistret[1000]; // lista på alla bilar
/******************* main ***********************/
int main(void)
{
person[1].namn = "Al Bundy";
person[1].antal_fordon = 1;
bil[1].modell = volvo;
bil[1].farg = gron;
bil1.agare = &person[1];
print_person(1); // funktion - skriv ut person nr 1
print_bil(1);// funktion - skriv ut bil nr 1
}
/************* funktioner (metoder) som hanterar objekt av typen "person" ********************/
void print_person(int nr)
{
//... skriv kod här ....
}
/************* funktioner (metoder) som hanterar objekt av typen "bil" ********************/
void print_bil(int nr)
{
//... skriv kod här ....
}
Här är ett exempel på hur man skulle kunna tänka lite "objektorienterad" i C:Al_Bundy skrev:Jag ser fler och fler skriver "man kan visst programmera objektorienterat med C!!!". Men varför sägs det allmänt att man inte kan göra det?
Jag är helt övertygad att man kan programmera objektorienterat via C, utan dessa "C++ klasser". Men jag har aldrig sett något exempel
Kod: Markera allt
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef void (*work)(void*);
typedef struct _person {
char name[20];
int age;
struct _person* owner;
work dowork;
} Person;
typedef struct
{
Person person;
char title[20];
} Manager;
typedef struct
{
Person person;
char title[20];
char workdescription[50];
} Employee;
void manager_work(Manager*manager)
{
printf("Manager %s is now busy doing whatever a %s is doing\n", manager->person.name, manager->title);
}
void employee_work(Employee*employee)
{
printf("Employee %s is now busy doing whatever a %s is doing: %s\n", employee->person.name, employee->title, employee->workdescription);
}
Employee* createEmployee(Person*owner, char*name, char*title, char*workdescription, int age)
{
Employee *newEmployee = (Employee*)malloc(sizeof(Employee));
newEmployee->person.owner = owner;
newEmployee->person.dowork = (work)employee_work;
strcpy(newEmployee->person.name, name);
newEmployee->person.age = age;
strcpy(newEmployee->title, title);
strcpy(newEmployee->workdescription, workdescription);
return newEmployee;
}
Manager* createManager(Person*owner, char*name, char*title, int age)
{
Manager *newManager = (Manager*)malloc(sizeof(Manager));
newManager->person.owner=owner;
newManager->person.dowork = (work)manager_work;
strcpy(newManager->person.name, name);
newManager->person.age = age;
strcpy(newManager->title, title);
return newManager;
}
int main(int argc, const char * argv[])
{
Person *theOwnr = (Person*)createManager(NULL, "Jack Owner", "Founder", 56);
Person *theBoss = (Person*)createManager(theOwnr, "John Boss", "Supermanager", 22);
Person *theDude = (Person*)createEmployee(theBoss, "Jim Worker", "Code monkey", "Produce code as fast as hell", 43);
theOwnr->dowork(theOwnr);
theBoss->dowork(theBoss);
theDude->dowork(theDude);
free(theOwnr);
free(theBoss);
free(theDude);
return 0;
}
Kod: Markera allt
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef void (*describe)(void*);
typedef struct {
describe describe;
} Fruit;
typedef struct
{
Fruit fruit;
} Apple;
typedef struct
{
Fruit fruit;
} Banana;
typedef struct
{
Fruit fruit;
} Orange;
void describe_apple(Apple*apple)
{
printf("An apple is round, either green or red. It does not have to be pealed\n");
}
void describe_banana(Banana*banane)
{
printf("A banana is yellow, long and slightly curved and needs to be pealed before eating\n");
}
void describe_orange(Orange*orange)
{
printf("An orange is round and orange, it needs to be pealed before eating\n");
}
Apple* createApple()
{
Apple *apple = (Apple*)malloc(sizeof(Apple));
apple->fruit.describe = (describe)describe_apple;
return apple;
}
Banana* createBanana()
{
Banana *banana = (Banana*)malloc(sizeof(Banana));
banana->fruit.describe = (describe)describe_banana;
return banana;
}
Orange* createOrange()
{
Orange *orange = (Orange*)malloc(sizeof(Orange));
orange->fruit.describe = (describe)describe_orange;
return orange;
}
int main(int argc, const char * argv[])
{
Fruit* fruit1 = (Fruit*)createApple();
Fruit* fruit2 = (Fruit*)createBanana();
Fruit* fruit3 = (Fruit*)createOrange();
fruit1->describe(fruit1);
fruit2->describe(fruit2);
fruit3->describe(fruit3);
free(fruit1);
free(fruit2);
free(fruit3);
return 0;
}
Kod: Markera allt
18-AUG-1994 12:48 AMAC V2.0-22
10-APR-1999 14:14 AMAC V3.1-23A1
10-APR-1999 14:28 BLISS-32E V1.3-023
12-JUL-2001 17:10 Compaq COBOL V2.7-1209
13-DEC-2012 07:06 Compaq COBOL V2.8-1286
10-APR-1999 10:36 DEC C V5.0-003
14-OCT-2003 14:17 DEC C V5.6-003
19-NOV-1998 07:43 DEC COBOL V2.0-271
1-FEB-1995 08:18 DEC Fortran V6.2-508
27-SEP-1994 13:57 Linker A11-14
20-JAN-2000 10:05 Linker A11-20
22-APR-2003 09:10 Linker A11-50
10-APR-1999 14:14 MACRO-64 X1.1-016
10-APR-1999 13:54 Message A02-12
15-SEP-2006 15:39 Oracle Rdb SQL V7.0-2
11-FEB-2007 10:06 Oracle Rdb SQL V7.2-010
Krille Krokodil skrev:Finns produkter för de som vill programmera uC men inte överge sitt kära gamla Basic eller Pascal:
http://www.mikroe.com/
C fortsätter väl att vara störst för att alla tillverkare fortsätter göra/stödja bibliotek för
de hårdvarunära funktionerna i det när de släpper en ny krets, kunde lika gärna varit
X, Y eller Z men nu blev det C som en gång i den digitala forntiden fick ett försprång
som än idag består.