перадаючы зменную масіў даўжыні да функцыі, я павінен выкарыстоўваць масіў параметры даўжыні або канец масіва маркер?

калі я праектаванне функцыі С, што трэба ўзяць зменную масіў даўжыні, як выбраць паміж:

    <�Літый> дадаць яшчэ адзін параметр, каб даць даўжыню масіва? і
  1. завяршэнне масіва з дапамогай спецыяльных маркераў (напрыклад, '\ 0')?
  2. якой-небудзь іншы варыянт? што?

напрыклад

void myfunc(int arr[], int arr_length) { ... }
...
int arr[3] = { 1, 2, 3 };
myfunc(myarr, 3);

або

void myfunc(int arr[]) { ... }
...
int arr[4] = { 1, 2, 3, '\0' };
myfunc(arr);
0
Перадача даўжыні заўсёды працуе. Варта часта легітымнае значэнне праз некаторы час.
дададзена аўтар Daniel Fischer, крыніца
Яшчэ адзін голас за праходжанне даўжыні масіва - у дадатку да згаданым прычынах ужо, ведаючы даўжыню, вы можаце сказаць, авансавы Ці канкрэтны індэкс знаходзіцца ў межах межаў масіва, але з дазорнай, вы павінны сканаваць ўвесь масіў, каб знайсці гэта перш, чым вы можаце вызначыць дакладнасць доступу да пэўнага індэксе.
дададзена аўтар Iridium, крыніца
Яшчэ адзін голас за праходжанне даўжыні масіва - у дадатку да згаданым прычынах ужо, ведаючы даўжыню, вы можаце сказаць, авансавы Ці канкрэтны індэкс знаходзіцца ў межах межаў масіва, але з дазорнай, вы павінны сканаваць ўвесь масіў, каб знайсці гэта перш, чым вы можаце вызначыць дакладнасць доступу да пэўнага індэксе.
дададзена аўтар Iridium, крыніца
Яшчэ адзін голас за праходжанне даўжыні масіва - у дадатку да згаданым прычынах ужо, ведаючы даўжыню, вы можаце сказаць, авансавы Ці канкрэтны індэкс знаходзіцца ў межах межаў масіва, але з дазорнай, вы павінны сканаваць ўвесь масіў, каб знайсці гэта перш, чым вы можаце вызначыць дакладнасць доступу да пэўнага індэксе.
дададзена аўтар Iridium, крыніца
Я аддаю перавагу першы, так што вы перакладаеце доступ з межаў.
дададзена аўтар Bill, крыніца
Я аддаю перавагу першы, так што вы перакладаеце доступ з межаў.
дададзена аўтар Bill, крыніца
У залежнасці ад таго, што робіць ваша функцыя, вы можаце таксама пайсці на Printf стылю зменнай даўжынёй ўстаноўкі аргументу.
дададзена аўтар Wander Nauta, крыніца
У залежнасці ад таго, што робіць ваша функцыя, вы можаце таксама пайсці на Printf стылю зменнай даўжынёй ўстаноўкі аргументу.
дададзена аўтар Wander Nauta, крыніца
У залежнасці ад таго, што робіць ваша функцыя, вы можаце таксама пайсці на Printf стылю зменнай даўжынёй ўстаноўкі аргументу.
дададзена аўтар Wander Nauta, крыніца
Вы ведаеце, што '\ 0' так жа, як 0 , праўда?
дададзена аўтар jamesdlin, крыніца
Вы ведаеце, што '\ 0' так жа, як 0 , праўда?
дададзена аўтар jamesdlin, крыніца

6 адказы

Канвенцыя прайсці даўжыню масіва, калі масіў не з'яўляецца масівам сімвалаў (гэта значыць, радок); у гэтым выпадку, C аўтаматычна нуль-завяршае радок з 0x00.

Вы можаце выкарыстоўваць нуль-тэрмінатар па вашаму выбару, каб завяршыць масіў. Напрыклад, калі ў вас ёсць масіў падпісаных Інтс, але як-то вы ведаеце, што ні адзін з іх не будзе адмоўнай, вы можаце выкарыстоўваць -1 (або любое адмоўнае лік). Праблема з выкарыстаннем нуль-тэрмінатара, што вы страціце некаторыя магчымыя значэнні. Возьмем, да прыкладу, тып дадзеных, які доўга 4 біта. Калі я вызначаю 0b1111 як тэрмінатар, то максімальнае значэнне я магу паставіць у маім масіве гэтага тыпу 0b1110. Прычына радок нуля з'яўляецца тое, што ў ASCII, ёсць больш лікі ад 0 да 255, чым ёсьць сімвалы, якія мы хацелі б выказаць, таму з дапамогай нуль-тэрмінатар не варта нічога.

Калі перадаць даўжыню масіва, і цыкл па ўсіх значэнняў у масіве, то вы аўтаматычна атрымліваеце максімальнае значэнне для выкарыстання на працягу цыклу. Акрамя таго, у C, вы амаль заўсёды ведаць даўжыню вашага масіва пры яго стварэнні.

EDIT: І наколькі прапусканне канца масіва маркера, гэта не павінен быць праблемай для праграм, якія вы працаваць на вашым кампутары, але я хацеў бы перагледзець, таму што розныя рэалізацыі апаратных сродкаў маюць розныя памеры тыпаў дадзеных. Калі ў вас ёсць масіў з 4 Інтс (16 біт) на вашым кампутары, ваш масіў, пачынаючы з 0x1000 скончыцца ў 0x1008 (да прыкладу) на вашым кампутары, але скончыцца ў 0x1004 на шахце.

1
дададзена

Канвенцыя прайсці даўжыню масіва, калі масіў не з'яўляецца масівам сімвалаў (гэта значыць, радок); у гэтым выпадку, C аўтаматычна нуль-завяршае радок з 0x00.

Вы можаце выкарыстоўваць нуль-тэрмінатар па вашаму выбару, каб завяршыць масіў. Напрыклад, калі ў вас ёсць масіў падпісаных Інтс, але як-то вы ведаеце, што ні адзін з іх не будзе адмоўнай, вы можаце выкарыстоўваць -1 (або любое адмоўнае лік). Праблема з выкарыстаннем нуль-тэрмінатара, што вы страціце некаторыя магчымыя значэнні. Возьмем, да прыкладу, тып дадзеных, які доўга 4 біта. Калі я вызначаю 0b1111 як тэрмінатар, то максімальнае значэнне я магу паставіць у маім масіве гэтага тыпу 0b1110. Прычына радок нуля з'яўляецца тое, што ў ASCII, ёсць больш лікі ад 0 да 255, чым ёсьць сімвалы, якія мы хацелі б выказаць, таму з дапамогай нуль-тэрмінатар не варта нічога.

Калі перадаць даўжыню масіва, і цыкл па ўсіх значэнняў у масіве, то вы аўтаматычна атрымліваеце максімальнае значэнне для выкарыстання на працягу цыклу. Акрамя таго, у C, вы амаль заўсёды ведаць даўжыню вашага масіва пры яго стварэнні.

EDIT: І наколькі прапусканне канца масіва маркера, гэта не павінен быць праблемай для праграм, якія вы працаваць на вашым кампутары, але я хацеў бы перагледзець, таму што розныя рэалізацыі апаратных сродкаў маюць розныя памеры тыпаў дадзеных. Калі ў вас ёсць масіў з 4 Інтс (16 біт) на вашым кампутары, ваш масіў, пачынаючы з 0x1000 скончыцца ў 0x1008 (да прыкладу) на вашым кампутары, але скончыцца ў 0x1004 на шахце.

1
дададзена

Канвенцыя прайсці даўжыню масіва, калі масіў не з'яўляецца масівам сімвалаў (гэта значыць, радок); у гэтым выпадку, C аўтаматычна нуль-завяршае радок з 0x00.

Вы можаце выкарыстоўваць нуль-тэрмінатар па вашаму выбару, каб завяршыць масіў. Напрыклад, калі ў вас ёсць масіў падпісаных Інтс, але як-то вы ведаеце, што ні адзін з іх не будзе адмоўнай, вы можаце выкарыстоўваць -1 (або любое адмоўнае лік). Праблема з выкарыстаннем нуль-тэрмінатара, што вы страціце некаторыя магчымыя значэнні. Возьмем, да прыкладу, тып дадзеных, які доўга 4 біта. Калі я вызначаю 0b1111 як тэрмінатар, то максімальнае значэнне я магу паставіць у маім масіве гэтага тыпу 0b1110. Прычына радок нуля з'яўляецца тое, што ў ASCII, ёсць больш лікі ад 0 да 255, чым ёсьць сімвалы, якія мы хацелі б выказаць, таму з дапамогай нуль-тэрмінатар не варта нічога.

Калі перадаць даўжыню масіва, і цыкл па ўсіх значэнняў у масіве, то вы аўтаматычна атрымліваеце максімальнае значэнне для выкарыстання на працягу цыклу. Акрамя таго, у C, вы амаль заўсёды ведаць даўжыню вашага масіва пры яго стварэнні.

EDIT: І наколькі прапусканне канца масіва маркера, гэта не павінен быць праблемай для праграм, якія вы працаваць на вашым кампутары, але я хацеў бы перагледзець, таму што розныя рэалізацыі апаратных сродкаў маюць розныя памеры тыпаў дадзеных. Калі ў вас ёсць масіў з 4 Інтс (16 біт) на вашым кампутары, ваш масіў, пачынаючы з 0x1000 скончыцца ў 0x1008 (да прыкладу) на вашым кампутары, але скончыцца ў 0x1004 на шахце.

1
дададзена

Абвясціць Int arr_length у якасці глабальнай зменнай. Няма неабходнасці, каб перадаць яго потым.

або

Прапускаюць даўжыню ў якасці аргументу. Але ніколі не выкарыстоўваць спецыяльны знак у якасці канчатковых маркераў. Калі вы перададзіце '\ 0' як Int обр [4] = {1, 2, 3, '\ 0'}; . Тады обр [3] будзе захоўваць ASCII эквівалент '\ 0' (<�моцны> 0 ) і якая цалкам можа быць часткай легітымнай ўваход.

0
дададзена
што, калі ёсць неабходнасць выклікаць гэтую функцыю некалькі разоў, і можа быць нейкай іншай функцыі неабходна атрымаць доступ як масівы адначасова?
дададзена аўтар Bill, крыніца

Абвясціць Int arr_length у якасці глабальнай зменнай. Няма неабходнасці, каб перадаць яго потым.

або

Прапускаюць даўжыню ў якасці аргументу. Але ніколі не выкарыстоўваць спецыяльны знак у якасці канчатковых маркераў. Калі вы перададзіце '\ 0' як Int обр [4] = {1, 2, 3, '\ 0'}; . Тады обр [3] будзе захоўваць ASCII эквівалент '\ 0' (<�моцны> 0 ) і якая цалкам можа быць часткай легітымнай ўваход.

0
дададзена
што, калі ёсць неабходнасць выклікаць гэтую функцыю некалькі разоў, і можа быць нейкай іншай функцыі неабходна атрымаць доступ як масівы адначасова?
дададзена аўтар Bill, крыніца

Абвясціць Int arr_length у якасці глабальнай зменнай. Няма неабходнасці, каб перадаць яго потым.

або

Прапускаюць даўжыню ў якасці аргументу. Але ніколі не выкарыстоўваць спецыяльны знак у якасці канчатковых маркераў. Калі вы перададзіце '\ 0' як Int обр [4] = {1, 2, 3, '\ 0'}; . Тады обр [3] будзе захоўваць ASCII эквівалент '\ 0' (<�моцны> 0 ) і якая цалкам можа быць часткай легітымнай ўваход.

0
дададзена
што, калі ёсць неабходнасць выклікаць гэтую функцыю некалькі разоў, і можа быць нейкай іншай функцыі неабходна атрымаць доступ як масівы адначасова?
дададзена аўтар Bill, крыніца