Zijn er andere veelvoorkomende “c-achtige” of niet “c-achtige” talen met een indexarraypositie die niet nul is?

C-programmeertaal staat bekend als een nul-index-arraytaal. Het eerste item in een array is toegankelijk met 0. Bijvoorbeeld double arr[2] = {1.5,2.5}Het eerste item in array arrstaat op positie 0. arr[0] === 1.5Welke programmeertalen zijn op 1 gebaseerde indexen?

Ik heb gehoord dat deze talen beginnen bij 1 in plaats van 0 voor arraytoegang: Algol, Matlab, Action!, Pascal, Fortran, Cobol. Is dit voltooid?

In het bijzonder zou een op 1 gebaseerde array toegang krijgen tot het eerste item met 1, niet nul.


Antwoord 1, autoriteit 100%

Een lijst is te vinden op wikipedia.

ALGOL 68
APL
AWK
CFML
COBOL
Fortran
FoxPro
Julia
Lua
Mathematica
MATLAB
PL/I
Ring
RPG
Sass
Smalltalk
Wolfram Language
XPath/XQuery

Antwoord 2, autoriteit 32%

Fortran begint bij 1. Ik weet dat omdat mijn vader Fortran programmeerde voordat ik werd geboren (ik ben nu 33) en hij bekritiseert moderne programmeertalen omdat ze bij 0 beginnen, en zegt dat het onnatuurlijk is, niet hoe mensen denken, in tegenstelling tot wiskunde, enzovoort.

Ik vind dingen die bij 0 beginnen echter heel natuurlijk; mijn eerste echte programmeertaal was C en *(ptr+n) zou niet zo goed hebben gewerkt als n niet bij nul was begonnen!


Antwoord 3, autoriteit 23%

Een behoorlijk grote lijst met talen staat op Wikipedia onder Vergelijking van programmeertalen (array)onder “Array systeem kruisverwijzingslijst” tabel (Standaard basis index kolom)

Ditheeft een goede discussie over 1- vs. 0- geïndexeerd en abonnementen in algemeen

Om uit de blog te citeren:

EWD831 door E.W. Dijkstra, 1982.

Als we te maken hebben met een rij met lengte N, de elementen waarvan we
wilt onderscheiden door subscript, de
volgende vervelende vraag is welk subscript?
waarde toe te wijzen aan het begin
element. Vasthouden aan conventie a)
opbrengsten, wanneer beginnend met subscript
1, het subscriptbereik 1 ≤ i < N+1;
beginnend met 0 geeft echter de
mooier bereik 0 ≤ i < N. Dus laten we laten
onze rangtelwoorden beginnen bij nul: an
ordinaal (subscript) van element is gelijk aan
het aantal elementen dat eraan voorafgaat in
de reeks. En de moraal van de
het verhaal is dat we beter rekening moesten houden
—na al die eeuwen!— nul als a
meest natuurlijke getal.

Opmerking:: Veel programmeertalen zijn ontworpen zonder de nodige tijd
aandacht voor dit detail. in FORTRAN
subscripts beginnen altijd bij 1; in ALGOL
60 en in PASCAL, conventie c) heeft
aangenomen; de meer recente SASL heeft
teruggevallen op de FORTRAN-conventie:
een reeks in SASL is tegelijkertijd
een functie op de positieve gehele getallen.
Medelijden! (Einde opmerking.)


Antwoord 4, autoriteit 18%

Fortran, Matlab, Pascal, Algol, Smalltalk en vele anderen.


Antwoord 5, autoriteit 18%

Je kunt het in Perl doen

$[ = 1;  # set the base array index to 1

Je kunt het ook met 42 laten beginnen als je daar zin in hebt. Dit heeft ook invloed op tekenreeksindexen.

Het gebruik van deze functie wordt ten zeerste afgeraden.


Antwoord 6, autoriteit 18%

Ook in Ada kunt u uw array-indexen desgewenst definiëren:

A : array(-5..5) of Integer;       -- defines an array with 11 elements
B : array(-1..1, -1..1) of Float;  -- defines a 3x3 matrix

Iemand zou kunnen beweren dat door de gebruiker gedefinieerde array-indexbereiken tot onderhoudsproblemen zullen leiden. Het is echter normaal om Ada-code te schrijven op een manier die niet afhankelijk is van de array-indexen. Voor dit doel biedt de taal elementattributen, die automatisch worden gedefinieerd voor alle gedefinieerde typen:

A'first   -- this has the value -5
A'last    -- this has the value +5
A'range   -- returns the range -5..+5 which can be used e.g. in for loops

Antwoord 7, autoriteit 11%

JDBC (geen taal, maar een API)

String x = resultSet.getString(1);  // the first column

Antwoord 8, autoriteit 11%

Erlang’s tuplesen lijstenindex beginnend bij 1.


Antwoord 9, autoriteit 10%

Lua – teleurstellend


Antwoord 10, autoriteit 6%

Er een gevonden – Lua (programmeertaal)

Controleer de sectie Arrays met de tekst –

“Lua-arrays zijn 1-gebaseerd: de eerste index is 1 in plaats van 0 zoals het is voor veel andere programmeertalen (hoewel een expliciete index van 0 is toegestaan)”


Antwoord 11, autoriteit 6%

VB Classic, tenminste via

Option Base 1

Antwoord 12, autoriteit 6%

Tekenreeksen in Delphibeginnen bij 1.

(Statische arrays moeten expliciet een ondergrens hebben. Dynamische arrays beginnen altijd bij 0.)


Antwoord 13, autoriteit 5%

ColdFusion – ook al is het Java onder de motorkap


Antwoord 14, autoriteit 5%

Ada en Pascal.


Antwoord 15, autoriteit 5%

PL/SQL. Een gevolg hiervan is dat wanneer u talen gebruikt die beginnen bij 0 en interactie heeft met Oracle, u de 0-1-conversies zelf moet afhandelen voor arraytoegang per index. Als u in de praktijk een constructie als foreachover rijen gebruikt of kolommen op naam opent, is dat niet zo’n groot probleem, maar misschien wilt u bijvoorbeeld de meest linkse kolom, die kolom 1 is.


Antwoord 16, autoriteit 5%

Indexen beginnen bij één in CFML.


Antwoord 17, autoriteit 5%

De hele Wirthiaanse reeks talen, waaronder Pascal, Object Pascal, Modula-2, Modula-3, Oberon, Oberon-2 en Ada (plus een paar andere die ik waarschijnlijk over het hoofd heb gezien), maakt het mogelijk om arrays te indexeren vanaf elk punt zoals het opnemen van, uiteraard, 1.

Erlang indexeert tupels en arrays van 1.

Ik denk – maar ben er niet langer zeker van – dat Algol en PL/1 beide indexeren vanaf 1. Ik ben er ook vrij zeker van dat Cobol indexeert vanaf 1.

In principe zijn de meeste programmeertalen op hoog niveau vóór C geïndexeerd vanaf 1 (waarbij assembleertalen om voor de hand liggende redenen een opmerkelijke uitzondering zijn – en de reden dat C-indexen vanaf 0 zijn) en veel talen van buiten de door C gedomineerde hegemonie doen dit nog steeds dag.


Antwoord 18, autoriteit 3%

Er is ook Smalltalk


Antwoord 19, autoriteit 3%

Visual FoxPro, FoxPro en Clipper gebruiken allemaal arrays waarbij element 1 het eerste element van een array is… Ik neem aan dat je dat bedoelt met 1-geïndexeerd.


Antwoord 20, autoriteit 3%

Ik zie dat de kennis van fortranhier nog steeds op de ’66-versie staat.

Fortran heeft variabele zowel de onder- als de bovengrens van een array.

Betekenis, als je een array declareert zoals:

real, dimension (90) :: x

dan is 1 de ondergrens (standaard).

Als je het aangeeft als

real, dimension(0,89) :: x

dan heeft het echter een ondergrens van 0.

Als je het aan de andere kant declareert als

real, allocatable :: x(:,:)

dan kun je het toewijzen aan wat je maar wilt. Bijvoorbeeld

allocate(x(0:np,0:np))

betekent dat de array de elementen zal hebben

x(0, 0), x(0, 1), x(0, 2 .... np)
x(1, 0), x(1, 1), ...
.
.
.
x(np, 0) ...

Er zijn ook enkele interessantere combinaties mogelijk:

real, dimension(:, :, 0:) :: d
real, dimension(9, 0:99, -99:99) :: iii

die worden achtergelaten als huiswerk voor de geïnteresseerde lezer 🙂

Dit zijn alleen degenen die ik me uit mijn hoofd herinnerde. Aangezien een van de belangrijkste sterke punten van fortran de array-handling-mogelijkheden zijn, is het duidelijk dat er veel andere in&outs zijn die hier niet worden genoemd.


Antwoord 21, autoriteit 3%

Niemand noemde XPath.


Antwoord 22, autoriteit 3%

Mathematica en Maxima, naast andere reeds genoemde talen.


Antwoord 23, autoriteit 3%

informix, naast andere reeds genoemde talen.


Antwoord 24, autoriteit 3%

Basis – niet alleen VB, maar alle oude regelgenummerde versies uit de jaren 80.

Richard


Antwoord 25, autoriteit 2%

FoxProgebruikte arrays vanaf index 1.


Antwoord 26, autoriteit 2%

dBASEgebruikte arrays vanaf index 1.

Arrays (begin) in dBASE


Antwoord 27, autoriteit 2%

RPG, inclusief moderne RPGLE


Antwoord 28

Hoewel C door ontwerp 0 is geïndexeerd, is het mogelijk om toegang te krijgen tot een array in C alsof deze met 1 (of een andere waarde) is geïndexeerd. Niet iets wat je van een normale C-coder zou verwachten, maar soms helpt het.

Voorbeeld:

#include <stdio.h>
int main(){
    int zero_based[10];
    int* one_based;
    int i;
    one_based=zero_based-1;
    for (i=1;i<=10;i++) one_based[i]=i;
    for(i=10;i>=1;i--) printf("one_based[%d] = %d\n", i, one_based[i]);
    return 0;
}

Other episodes