인터페이스"C

N

nge

Guest
코드는 수치 조리법 도서입니다.내가 이해하지 못했 것은 줄에 "반환 브이 - nl NR_END이다;".지금까지 내가 스토리지 할당하는 malloc을 반환 지점을 알아.아무도 내게 설명할 수있다.

플로트 * 벡터 (오래, 오래 뉴 햄프셔) nl
/ [nl .. 뉴 햄프셔] * 첨자 범위의 v를 함께 있자 벡터를 할당 * /
(
플로트 * v를;

v를 = (*) malloc ((size_t float)은 ((뉴 햄프셔 - nl 1 NR_END) * sizeof (float)은));
만약 벡터에 (! v) 본 nrerror ( "할당 실패 ()");
반환 브이 - nl NR_END;
)

 
안녕NR_END 1 정의 #

NR_END "그냥 사건"을하기 위해서는 0을 반환하지하는 것입니다uther

 
안녕,

난 디이 (뉴 햄프셔 = 10 = 5 nl) tryed가 :

# 포함 <stdio.h>
# 포함 <stdlib.h>메인 (무효) 무효 (플로트 * v를, * paux;

v를 = (*) malloc ((size_t) ((10-5 1 1) 플로트 * sizeof (float)은));

paux = v를 - 5 1;

* paux = 1.0;

)배급 정화가 함께 Runing 알려줍니다 :

[이메일] ABW : 배열 범위를 주요 사건에서 (1)를 써주세요
0x01331980에 0x01331980 불법에서 (4 바이트) 4 바이트 쓰기
주소 0x01331980 28 바이트의 블록을 시작하기 전에 16 바이트는 0x01331990입니다
malloc'd 블록 주소 0x01331980 포인트
스레드 ID : 0x5b4
오류 위치
메인 [teste.c : 16]
/ / paux = v를;
paux = v를 - 5 1;

= "* paux = 1.0;

)
mainCRTStartup [crt0.c : 206]
할당 위치
malloc [dbgheap.c : 129]
메인 [teste.c : 11]
mainCRTStartup [crt0.c : 206]그래서,이, 또는 코드 nl의 포인터를 incremente 것입 함수를 사용하여 잘못된 생각한다.

NeuralC

 
그것을 간단하게 메모리 할당자 vecter NR 나라입니다 엔드 엔드의 기원입니다 rountine

해달이 너무 올바른 헤더와 lib 디렉토리를 포함 또한 잊지

 
그 코드는 간단한 벡터를 메모리에 저장 할당자 알아.하지만 난 줄에 "반환 브이 - nl NR_END 이해하지 못했지만;".함수는 메모리 할당 malloc와 할당된 메모리 블록의 시작 포인터를 반환, 그렇지?우리가 왜 nl 빼서 포인터를 재배치해야합니까 NR_END?

 
안녕,

NR_END의 의미를 pp에서 설명합니다.940-941 수치 조리법의 대부분이 C에서 (2 에드.) :
2.
단위 - 오프셋 벡터.
x1.2 있음, 우리는 어떻게 단위 벡터 오프셋 BB 탄 [1 .. 4] 될 수 설명제로로부터 얻은 - 오프셋 배열 b [0 .. 3] 포인터 산술 작업을 BB 탄 = b - 1.
이후b 전에 한 위치 bb는 점, BB 탄 [1], 등등 b [0]과 같은 요소를 해결할 수있습니다.엄밀히 말하면,이 제도적으로 ANSI C 표준에 의해 축복을하지 않습니다.
문제는사실이 아니다는 b - 1 포인트에 할당되지 않은 스토리지 : 위치 b - 1 참조되지 않을 것입니다할당된 지역으로 다시 증가하지 않고.
오히려, 문제는 그것을 수도있습니다드문 경우에서 일어나는 (그리고 아마도 세분화 시스템에만 해당) 그 표현이 B에서 - 1전혀 표현하고있다.
이러한 문제가 발생하는 경우, 그럼, 아무 보장이 관계를b = (나 - 1) 1 만족입니다.실제로 많은 문제가 하나 이상의 생각을 수도 미만이있습니다.
우리는 인식하지 않습니다모든 컴파일러가 또는 기계가 어떤 b = (십억원) N을 작은 정수가 아니길에 대한 사실 실패
조차세분화 기계, 무슨 일이 일반적으로이 컴파일러 일부 매장 (아마도 불법)입니다억유로의 표현, 그리고 그게 B가 recoveredwhen n 다시이 표현에 추가됩니다.광범위한 사용은 C 초판 수치 요리법의 메모리 할당 루틴, 이후1988,이 모든 문제가 있고, 우리도 여기에 자신의 실패의 한 보고서를하지 않았다면이그 이론적으로 그것이 실패할 수있는 우리에게 말해줬어야 많은 독자를 존중 ()에도 불구하고.우리는 또한 표준 단체)의 축복 b = (억유로의 전달이 바람직함 (에 nn의 일부 범위를 최소한으로 입력 짧은 representable) 미래의 표준, 거기부터 n 말이렇게하면 기존의 컴파일러와 아무 충돌이있을 것 같다.문제는 모든 실험 (이 이론에 반대하는 부재)에도 불구하고, 우리가우리의 벡터 및 매트릭스를 할당 루틴을보다가 ANSI 수 있도록이 제품 몇 가지 조치를 취하고있습니다
준수. 리스팅 즉, 매개 변수 NR_END 여분의 스토리지를 숫자로 사용은 다음과 같습니다 있음위치의 모든 벡터 또는 매트릭스 블록의 시작 부분에서 목적은 단순히 할당만들기 오프셋을 포인터를 참조 - representable 보장합니다.우리가 기본값으로 설정 NR_END1의 가치.이것은 모든 유닛 만들기 오프셋 할당 (예, b = 벡터 (1,7);의 효과가있다With NR_END = 1, the number또는 = 매트릭스 (1,128,1,128);) 엄격하게 ANSI 호환이됩니다.
NR_END = 1, 전화 번호저장 위치 낭비를 상당히 무시할 수있습니다.
오프셋보다 1 서로 배치 (예,b = 벡터 (2,10))은 아직 이론이 아닌 준수하지만, 실질적으로 알 수있습니다 우리가루틴.
만약 이러한 할당을 만들 필요하면 값을 증가를 고려할 수있습니다NR_END의 (즉, 더 큰 가치를 낭비 스토리지의 양을 증가) 지적했다.
함수 suscripts nl에서 뉴 햄프셔에 이르기까지 함께 배열 v를위한 메모리 할당 및 V에 대한 포인터를 반환합니다 [0]에 상관없이 nl있다.이 방법에서는, & v를 [내가] (브이 i) 미국 nl의 관계없이 동일합니다.그것은 배열의 시작 부분에 NR_END 변수의 여분의 스토리지를 넣습니다.
함께 NR_END = 1은 어떤 기계 subscripts 0에서 1 (nl = 0, C에서 평소처럼) 또는 이르기까지 다양한 작업을 위해 만들어진 것입니다 (nl = 1, 단위 Matlab에서 사용되는 예를 들어, 오프셋 벡터).

안부

부터 Z
[/ B 층]

 

Welcome to EDABoard.com

Sponsor

Back
Top