1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
const int max1 = 50;
typedef struct {
int a;
float b;
const char *s;
} foo;
typedef struct {
long x;
short y;
foo[max1] _foo;
} bar;
bar[1000] _bar;
2012-08-21T19:52:54 rostiWie wärs mit Hash-Referenzen:
--Rosti
QuoteAehmmm, danke erstmal. Aber mir geht es hauptsaechlich um die Verschachtelung beider Strukturen, und auch darum, dass foo als array der Groesse max1 (hier 50) in bar enthalten ist, bzw. dass es spaeter ein array von 1000 bar(s) gibt.
2012-08-22T06:58:26 rostiQuoteAehmmm, danke erstmal. Aber mir geht es hauptsaechlich um die Verschachtelung beider Strukturen, und auch darum, dass foo als array der Groesse max1 (hier 50) in bar enthalten ist, bzw. dass es spaeter ein array von 1000 bar(s) gibt.
Dann gebe ich Dir mal den unschätzbaren Hinweis, dass Du im Gegensatz zu c in Perl den Speicherbedarf nicht reservieren musst, das macht Perl ganz von selbst ;)
--Rosti
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25
#! /usr/bin/env perl use strict; use warnings; use Storable qw(dclone); my $max_foo = 4; my $max_bar = 3;; my %foo = ( a => undef, b => undef, s => undef, ); my %bar = ( x => undef, y => undef, foo => [ map { dclone(\%foo) } 1 .. $max_foo ], ); my @_bar = map { dclone( \%bar ) } 1 .. $max_bar; require Data::Dumper; print Data::Dumper->Dump( [ \@_bar ], [ "*_bar" ] );
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19
#! /usr/bin/env perl use strict; use warnings; use Storable qw(dclone); my $max_foo = 4; my $max_bar = 3;; my @_bar2 = map { { x => undef, y => undef, foo => [ map { { a => undef, b => undef, s => undef } } 1 .. $max_foo ] } } 1 .. $max_bar; require Data::Dumper; print Data::Dumper->new( [ \@_bar2 ], [ "*_bar" ] )->Sortkeys(1)->Dump();
2012-08-21T20:37:28 LinuxerHi, ich denke, es wären sowohl ein AoA (Array of Arrays) als auch ein AoH (Array of Hashes) denkbar.
Ein AoH hätte den Vorteil, dass man auf die Felder Zugriff über Namen/Hash-Keys hat.
my @result = map { ... CODE ... } @input;
2012-08-22T14:10:40 murphyDas geht in Richtung funktionale Programmierung und da das erste Argument von map ein Codeblock, also eine Funktion ist, ist map selbst eine Funktion höherer Ordnung.
foo => [ map { { a => undef, b => undef, s => undef } } 1 .. $max_foo ]
2012-08-22T14:10:40 murphySolche hochtrabenden Bezeichnungen sind aber eher geeignet, bei Unwissenden Eindruck zu schinden, als wirklich etwas zu erklären ;-)
2012-08-22T14:50:54 Linuxermap() ist eigentlich dazu gedacht, Werte einer Liste zu überarbeiten und dann wieder eine (Ergebnis)Liste auszugeben.
Ich "missbrauche" das an dieser Stelle ein wenig. Die Liste, die ich übergebe ( 1..$max_foo ), liefert eben $max_foo Elemente, für die map jeweils den Code-Block ausführt.
Im Code-Block wird $_ auf den aktuellen Wert der Liste gesetzt; aber hier egal, weil ich es gar nicht verwende.
Damit dient dieses map {} 1..$x hier nur dazu, den Code-Block $x mal auszuführen.
Eine for-Schleife wäre eigentlich passender, lässt sich aber nicht so schön in den Aufbau der Datenstruktur integrieren.
@neues_array = map { <Regel von Element alt nach neu> } @altes_array
@zahlen_plus_eins = map { $_ + 1 } @zahlen
my @_bar = (dclone( \%bar )) x $max_bar;
2012-08-22T12:14:51 MuffiWenn ich mich recht erinner sollt auch
Code (perl): (dl )my @_bar = (dclone( \%bar )) x $max_bar;
funktionieren.