Få olika värden från samma variabel i ADA95

Permalänk
Medlem

Få olika värden från samma variabel i ADA95

Hej!

Som titeln lyder, kan jag på något sätt kunna hämta och skriva ut tex 2 eller fler tal från enbart 1 variabel av Integer?

Tar en enkel kodsnutt som exempel;

with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure In_Och_Utmatning is I : Integer; begin Put("Mata in fem heltal: "); -- Säg att jag matar in typ 5 33 92 48 12 här Get(I); -- Kan jag på något sätt hämta alla 5 olika tal via samma deklarerade Integer? Skip_Line; Put("Du matade in heltalen: "); Put(I, Width => 0); -- Och här då spotta ut dem igen end In_Och_Utmatning;

Visa signatur

Ryzen 5600x || 16GB RAM || Gigabyte B550 || Asus STRIX GTX 1080 Gaming || RM850x || Laptop: Dell XPS 13 9370

Permalänk
Medlem

@gojtan: Nej, en integer (heltal) kan inte ha fler än ett värde. Du vill istället använda en lista av heltal. Kan inte ada men läs på om arrayer så ska det nog lösa sig

Visa signatur

| Ryzen 5800x | Asus prime x470 pro | Asus rtx 3080 tuf oc | Gskill 32gb 3,6ghz | aw3225qf |

Permalänk
Medlem
Skrivet av Ragin Pig:

@gojtan: Nej, en integer (heltal) kan inte ha fler än ett värde. Du vill istället använda en lista av heltal. Kan inte ada men läs på om arrayer så ska det nog lösa sig.

Kändes fel, men arrayer låter ju vettigt. Ska läsa på litegrann!

Visa signatur

Ryzen 5600x || 16GB RAM || Gigabyte B550 || Asus STRIX GTX 1080 Gaming || RM850x || Laptop: Dell XPS 13 9370

Permalänk

Ursäkta! Men ADA95...vad används detta till?

Permalänk
Medlem
Skrivet av heretic16:

Ursäkta! Men ADA95...vad används detta till?

Det främsta syftet med Ada är att plåga datavetenskapsstudenter

Men förutom det så utvecklades det av USA:s försvarsdepartement, och är ett väldigt starkt typat språk designat att vara så säkert som möjligt. D.v.s. språket är väldigt strikt och har stöd för väldigt många kontroller vid kompileringen, och syntaxen är utformad så att det ska vara svårt att göra enkla fel. Det används framförallt till kritiska projekt där programmeringsfel kan vara ödesdigra, t.ex. för mjukvara i flygplan eller militära projekt. Men utöver det har Ada aldrig blivit särskilt populärt, troligtvis p.g.a. att syntaxen och säkerhetstänket gör det så omständligt att programmera i.

Permalänk
Skrivet av perost:

Det främsta syftet med Ada är att plåga datavetenskapsstudenter

Men förutom det så utvecklades det av USA:s försvarsdepartement, och är ett väldigt starkt typat språk designat att vara så säkert som möjligt. D.v.s. språket är väldigt strikt och har stöd för väldigt många kontroller vid kompileringen, och syntaxen är utformad så att det ska vara svårt att göra enkla fel. Det används framförallt till kritiska projekt där programmeringsfel kan vara ödesdigra, t.ex. för mjukvara i flygplan eller militära projekt. Men utöver det har Ada aldrig blivit särskilt populärt, troligtvis p.g.a. att syntaxen och säkerhetstänket gör det så omständligt att programmera i.

Bortsett från att plåga...varför inte bara använda Java? Det är ju ett riktigt vektyg för att lösa riktiga problem.

Permalänk
Medlem
Skrivet av gojtan:

Hej!

Som titeln lyder, kan jag på något sätt kunna hämta och skriva ut tex 2 eller fler tal från enbart 1 variabel av Integer?

Tar en enkel kodsnutt som exempel;

with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure In_Och_Utmatning is I : Integer; begin Put("Mata in fem heltal: "); -- Säg att jag matar in typ 5 33 92 48 12 här Get(I); -- Kan jag på något sätt hämta alla 5 olika tal via samma deklarerade Integer? Skip_Line; Put("Du matade in heltalen: "); Put(I, Width => 0); -- Och här då spotta ut dem igen end In_Och_Utmatning;

Om man bortser från att arrayer nog är det du egentligen söker, så skulle man kunna lösa uppgiften någorlunda med hjälp av bas tio upphöjningar vid inmatning och division/modulus vid utmatning. På samma vis som man vanligtvis löser uppgifter att räkna valörer i ett belopp. Förutsätter nog dock att antalet inmatningar är känt, sen är du även begränsad till hur stor en integer får lov att vara.

Permalänk
Datavetare
Skrivet av heretic16:

Ursäkta! Men ADA95...vad används detta till?

Ett område väldigt få plattformar/programspråk tagit sig är utveckling av programvara "som inte får gå fel", d.v.s. där en bug kan betyda att någon dör och/eller ge betydande materiella skador. Notera att man även måste certifiera "tool-chain", d.v.s. de program som används för att kompilera/köra programvaran, det är orsaken till varför de flesta "högnivåspråk" blir diskvalificerade -> är orimligt dyrt att certifiera tool-chain!

Man har försökt att få till någon nedskalad variant av Java för t.ex. DO-178B/C (en specifikation för hur programvara som används i flygindustrin ska certifieras), det har så vitt jag vet aldrig lyckats. DO-178B/C är ett av områdena där Ada tydligen fortfarande används.

Har skrivit kod mot den standarden, men det har uteslutande varit i C.

@gojtan: svaret på exakt du fråga ser ut lite så här (har inte jobbat med Ada, eller Modula-3 som påminner lite om Ada, sedan KTH-tiden, så detaljer kan vara off )

with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure In_Och_Utmatning is type My_Numbers is array (1..5) of Integer; Nums : My_Numbers; begin Put("Mata in fem heltal: "); -- Säg att jag matar in typ 5 33 92 48 12 här for i in 1..Nums'Length loop Get(Nums(i)); end loop; Skip_Line; Put("Du matade in heltalen: "); for i in 1..Nums'Length loop Put(Nums(i), width => 0); Put(" "); end loop; end In_Och_Utmatning;

Men känns ändå som "läsa in exakt fem tal" är lite väl specifikt, vad är den egentliga uppgiften om man tar några steg tillbaka? (Lär nog inte kunna hjälpa för ovan var redan gränsfall för vad jag kommer ihåg av Ada).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Ada har också möjligheten till en lista som växer dynamiskt. Det går till så att man från det första objektet pekar på nästa som i sin tur pekar på nästa o.s.v.

Permalänk
99:e percentilen
Skrivet av heretic16:

Bortsett från att plåga...varför inte bara använda Java? Det är ju ett riktigt vektyg för att lösa riktiga problem.

Du tänker verkligen inte ge dig, förstår jag.

Visa signatur

Skrivet med hjälp av Better SweClockers

Permalänk
Medlem

En Integer är kodad som en sträng av bits. Det innebär att du kan "skifta" innehållet i sidled med hjälp av multiplikationer och divisioner med multiplar av 2. Du kan då lagra flera (små) heltal i olika delar av den sträng av bitar som en Integer består av.

En 64 bitars Integer kan alltså lagra åtta 8-bitars heltal. Eller fyra 16-bitars heltal. Ungefär som en array men inne i en Integer.

Man gör normalt inte så här annat än vid komprimering eller programmering direkt mot hårdvara. Exempelvis avläsning eller programmering av sensorer. Och då använder man typiskt C.

Visa signatur

Linux och Android

Permalänk
Skrivet av Yoshman:

Ett område väldigt få plattformar/programspråk tagit sig är utveckling av programvara "som inte får gå fel", d.v.s. där en bug kan betyda att någon dör och/eller ge betydande materiella skador. Notera att man även måste certifiera "tool-chain", d.v.s. de program som används för att kompilera/köra programvaran, det är orsaken till varför de flesta "högnivåspråk" blir diskvalificerade -> är orimligt dyrt att certifiera tool-chain!

Man har försökt att få till någon nedskalad variant av Java för t.ex. DO-178B/C (en specifikation för hur programvara som används i flygindustrin ska certifieras), det har så vitt jag vet aldrig lyckats. DO-178B/C är ett av områdena där Ada tydligen fortfarande används.

Har skrivit kod mot den standarden, men det har uteslutande varit i C.

@gojtan: svaret på exakt du fråga ser ut lite så här (har inte jobbat med Ada, eller Modula-3 som påminner lite om Ada, sedan KTH-tiden, så detaljer kan vara off )

with Ada.Text_IO; use Ada.Text_IO; with Ada.Integer_Text_IO; use Ada.Integer_Text_IO; procedure In_Och_Utmatning is type My_Numbers is array (1..5) of Integer; Nums : My_Numbers; begin Put("Mata in fem heltal: "); -- Säg att jag matar in typ 5 33 92 48 12 här for i in 1..Nums'Length loop Get(Nums(i)); end loop; Skip_Line; Put("Du matade in heltalen: "); for i in 1..Nums'Length loop Put(Nums(i), width => 0); Put(" "); end loop; end In_Och_Utmatning;

Men känns ändå som "läsa in exakt fem tal" är lite väl specifikt, vad är den egentliga uppgiften om man tar några steg tillbaka? (Lär nog inte kunna hjälpa för ovan var redan gränsfall för vad jag kommer ihåg av Ada).

Vadå? Kan man aldrig göra fel i ADA?

Permalänk
Datavetare
Skrivet av heretic16:

Vadå? Kan man aldrig göra fel i ADA?

Självklart kan man göra fel på logiknivå i alla språk. Det är inte vad de olika standarderna för certifiering av säkerhetskritisk programvara går ut på heller, utan de fokuserar på att domänexperter ska kunna verifiera logiken (utan att kunna programmera) samt att man ska nå en "tillräckligt hög" konfidens i att programvaran är korrekt.

Exakt var "tillräckiligt hög" menas varierar mellan standarder och även inom en standard har man normal flera nivåer, DO-168C har fem olika nivåer. Är extremt dyrt att certifiera till hösta nivån.

Fördelen med ett språk som Ada har redan nämnts: det är designat på ett sätt som omöjliggör en rad relativt vanliga fel.

Går ju att skjuta sig i foten på rätt många sätt i C, ändå skriver folk säkerhetskritiska saker på högsta nivå där. Vägen fram där är att man i praktiken bara tillåter en delmängd av C + C är faktiskt relativt enkelt att verifiera då absolut inget kan anropas implicit där (vilket om jag minns rätt även är fallet i Ada).

Visa signatur

Care About Your Craft: Why spend your life developing software unless you care about doing it well? - The Pragmatic Programmer

Permalänk
Medlem

Ty help boys.
Jag antar att man använder ADA i skolmiljö pga hur primitivt det är och pga detta förstår man bättre hur sagd funktion egentligen fungerar.

Problemet löst iallafall!
Puss på ljumsken!

Visa signatur

Ryzen 5600x || 16GB RAM || Gigabyte B550 || Asus STRIX GTX 1080 Gaming || RM850x || Laptop: Dell XPS 13 9370

Permalänk
Medlem

En till fråga; om någon läser

VAD är skillnaden på Put() och Put_Line()? Samt Get() och Get_Line()?

Hittar ingen skillnad..

Visa signatur

Ryzen 5600x || 16GB RAM || Gigabyte B550 || Asus STRIX GTX 1080 Gaming || RM850x || Laptop: Dell XPS 13 9370

Permalänk
Medlem
Skrivet av gojtan:

En till fråga; om någon läser

VAD är skillnaden på Put() och Put_Line()? Samt Get() och Get_Line()?

Hittar ingen skillnad..

Put_Line anropar Put på argumentet och sen New_Line, se Adas referensmanual. D.v.s. Put skriver bara ut argumentet, medan Put_Line skriver ut argumentet och sen går till nästa rad.

Skillnaden mellan Get och Get_Line är att Get tar en sträng som argument och läser in lika många karaktärer som strängen har plats för. Get_Line läser istället tecken tills den når slutet av en rad, och returnerar en ny sträng med innehållet.

Permalänk
Medlem
Skrivet av gojtan:

En till fråga; om någon läser

VAD är skillnaden på Put() och Put_Line()? Samt Get() och Get_Line()?

Hittar ingen skillnad..

Går det snabbare att fråga här än att göra ett minimalt testprogram som mycket tydligt visar skillnaden så har du problem...

Visa signatur

Linux och Android

Permalänk
Medlem
Skrivet av perost:

Put_Line anropar Put på argumentet och sen New_Line, se Adas referensmanual. D.v.s. Put skriver bara ut argumentet, medan Put_Line skriver ut argumentet och sen går till nästa rad.

Skillnaden mellan Get och Get_Line är att Get tar en sträng som argument och läser in lika många karaktärer som strängen har plats för. Get_Line läser istället tecken tills den når slutet av en rad, och returnerar en ny sträng med innehållet.

!! Tack du är en pärla, testade bara med en rad text lite snabbt, inte konstigt jag inte såg skillnaden då.
Muchos gracias.

(till skillnad från besserwissern under dig)

Skickades från m.sweclockers.com

Visa signatur

Ryzen 5600x || 16GB RAM || Gigabyte B550 || Asus STRIX GTX 1080 Gaming || RM850x || Laptop: Dell XPS 13 9370